Какие проблемы могут возникнуть при использовании многопоточности

«Какие проблемы могут возникнуть при использовании многопоточности» — вопрос из категории Многопоточность, который задают на 31% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

  1. Race Condition – когда несколько потоков обращаются к общим данным без синхронизации, и результат зависит от порядка выполнения.
    var counter = 0
    repeat(100) {
        thread { counter++ } // Непредсказуемый результат
    }
  1. Deadlock – взаимная блокировка потоков, когда каждый ждёт освобождения ресурса, занятого другим.
    val lockA = Any()
    val lockB = Any()
    thread { synchronized(lockA) { synchronized(lockB) { ... } } }
    thread { synchronized(lockB) { synchronized(lockA) { ... } } }
  1. Memory Leaks – утечки из-за удержания ссылок в фоновых потоках (например, Thread или HandlerThread без очистки).

  2. UI-заморозки – долгие операции в главном потоке приводят к лагам интерфейса.

  3. LiveData/Flow Race – подписка на данные из фонового потока без правильного контекста (Dispatchers.Main.immediate).

Решение: Использовать Coroutine с Mutex, SharedFlow, или synchronized, избегать блокировок, проверять контексты.

Видео-ответы