Вопрос раскрывает опасности использования Dispatchers.Unconfined в корутинах.
Unconfined запускает корутину в текущем потоке и может продолжить в любом другом после suspend. Это приводит к неожиданным race condition и утечкам.
Unconfined:Непредсказуемый поток:
launch(Dispatchers.Unconfined) {
println("Start in ${Thread.currentThread().name}") // Main
delay(1000)
println("After delay in ${Thread.currentThread().name}") // Может быть другой поток!
}Утечки ресурсов:
Если корутина не завершится, она может "застрять" в фоновом потоке.
fun main() {
runBlocking {
launch(Dispatchers.Unconfined) {
println("Initial thread: ${Thread.currentThread().name}") // main
delay(500)
println("New thread: ${Thread.currentThread().name}") // DefaultDispatcher
// Опасность: доступ к UI из не-main потока!
button.text = "Updated" // Crash: CalledFromWrongThreadException
}
}
}Вывод:
Используйте Unconfined только для тестов или крайних случаев, где поток не важен.