В предыдущей статье мы рассмотрели базовый пример асинхронного выполнения. Вы, вероятно, уже знакомы с двумя распространенными проблемами параллелизма, общим изменяемым состоянием и взаимоблокировками. Эти проблемы являются общими для обоих языков и имеют схожие решения. Давайте посмотрим на них.

Мы начнем с Общего изменяемого состояния. В приведенном ниже примере мы пытаемся асинхронно увеличить некоторое значение int в 1000 раз.

Как и ожидалось, значение не равно 1000 и время от времени меняется. Решение Shared Mutable State довольно простое: нам нужно синхронизировать чтение и запись изменяемой переменной. Это означает, что операции чтения и записи должны последовательно выполняться в одном и том же потоке.

Вы можете заметить, что здесь мы просто конвертируем наш асинхронный код в синхронный и не получаем никаких преимуществ многопоточного выполнения. Да, это правда, потому что здесь мы ничего не делаем, а просто меняем изменяемое состояние. В реальном коде может быть большая часть с вычислением, которое нужно выполнять в фоновом режиме и лишь последовательно сохранять результат своего выполнения.

Вторая проблема называется Взаимоблокировки. Как правило, это происходит, когда какой-то блок кода ожидает завершения выполнения второго блока, но также ожидает завершения выполнения первого блока.

В этих примерах мы используем однопотоковую очередь и два блока кода. В первом блоке мы запускаем второй синхронно, поэтому он приостанавливает свое выполнение до тех пор, пока новый блок не завершит свое выполнение. Но второй блок не запустится, потому что он помещен в конец рабочей очереди и не может запуститься, пока предыдущий блок не будет завершен. Мой совет, чтобы избежать таких взаимоблокировок: не используйте одну и ту же очередь для вложенных асинхронных блоков.

Это были самые распространенные проблемы параллелизма, с которыми я сталкивался сам. Как видите, проблемы параллелизма и их решения очень похожи в обоих языках. Это было одной из причин, побудивших меня создать свой курс и книгу, в которой я показываю, как можно разрабатывать на платформах Android и iOS с помощью Kotlin и Swift, создавать одну и ту же архитектуру с использованием нативных инструментов.

Спасибо за чтение. Если вы заинтересованы в улучшении своих навыков мобильной разработки, загляните на мой сайт.