Почему не рекомендуется использовать unconfined в корутинах

«Почему не рекомендуется использовать unconfined в корутинах» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Unconfined — это диспетчер, который запускает корутину в текущем потоке до первой точки приостановки, а затем продолжает её в потоке, который возобновляет работу.

Проблемы:

  1. Непредсказуемость потока — после suspend корутина может продолжиться в другом потоке, что усложняет отладку.
  2. Риск блокировки UI — если начать в главном потоке и вызвать блокирующую операцию до первой точки приостановки, UI зависнет.
  3. Не рекомендуется для прода — подходит только для тестов или очень специфичных случаев.

Пример:

// Плохо: может блокировать UI или переключиться на другой поток
GlobalScope.launch(Dispatchers.Unconfined) {
    doBlockingWork() // Опасно, если вызвано в Main-потоке!
    withContext(Dispatchers.IO) { ... } // После suspend поток может измениться
}

Лучше использовать явные диспетчеры (Dispatchers.IO, Dispatchers.Default или Dispatchers.Main).