Что такое взаимная блокировка

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

Ответ

Взаимная блокировка (deadlock) — ситуация, когда два или более потока бесконечно ожидают освобождения ресурсов, захваченных друг другом.

Условия возникновения:

  1. Взаимное исключение (ресурс занят одним потоком).
  2. Удержание и ожидание (поток держит ресурс и ждёт другой).
  3. Отсутствие вытеснения (ресурс нельзя отобрать).
  4. Циклическое ожидание (замкнутая цепочка потоков).

Пример:

val lockA = Object()
val lockB = Object()

Thread {
    synchronized(lockA) {
        Thread.sleep(100)
        synchronized(lockB) { /* ... */ }
    }
}.start()

Thread {
    synchronized(lockB) {
        Thread.sleep(100)
        synchronized(lockA) { /* ... */ }
    }
}.start()

Решение:

  • Упорядочивание блокировок (всегда захватывать lockA перед lockB).
  • Использование tryLock с таймаутом.
  • Отказ от вложенных блокировок.