Были ли проблемы или баги, связанные с многопоточностью и корутинами
Что проверяют
Работали ли вы с конкурентностью в реальном проекте, а не только по документации. Интервьюеру важны симптом, способ поиска причины и системный вывод. Следом обычно спрашивают про отмену корутин и обработку исключений.
Как отвечать
Нужна своя история: какой был симптом (падение, ANR, неверные данные на экране), как воспроизвели, в чём была причина и что поменяли, чтобы не повторилось. Типичные классы таких багов:
- гонка за общее состояние: несколько корутин на
Dispatchers.Defaultменяют один список или счётчик. ЛечитсяMutex, атомарнымMutableStateFlow.update {}или привязкой к одному потоку черезlimitedParallelism(1); - проглоченная отмена:
catch (e: Exception)илиrunCatchingловятCancellationException, и корутина продолжает работу после закрытия экрана. Отмену нужно пробрасывать дальше; - работа в фоне и утечки:
GlobalScopeвместоviewModelScopeиlifecycleScope, сборFlowбезrepeatOnLifecycle(Lifecycle.State.STARTED), и подписка живёт в свёрнутом приложении; - блокировка главного потока:
runBlockingили синхронный ввод-вывод на Main дают ANR.viewModelScopeпо умолчанию работает наDispatchers.Main.immediate, поэтому тяжёлую работу оборачивают вwithContext(Dispatchers.IO); - исключения: в обычном
Jobпадение одного дочернего отменяет соседей, нуженSupervisorJobилиsupervisorScope.CoroutineExceptionHandler, установленный в дочернюю корутину, не вызывается.
Закончите профилактикой: диспетчеры внедряются через конструктор, в тестах runTest и StandardTestDispatcher.
Если серьёзных багов не случалось, не выдумывайте. Скажите об этом и расскажите, какие из этих ошибок ловили на ревью и какие правила их предотвращают.
Где спотыкаются
Рассказывают только про withContext(Dispatchers.Main) для обновления UI. Это азбука, а не история про баг.
Считают Mutex полным аналогом synchronized. Он не реентерабельный: повторный lock() в той же корутине приводит к взаимной блокировке.
Надеются на @Volatile для общего счётчика. Он даёт видимость изменений между потоками, но не атомарность, и count++ из разных корутин всё равно теряет обновления.