Ответ
Взаимная блокировка (deadlock) — ситуация, когда два или более потока бесконечно ожидают освобождения ресурсов, захваченных друг другом.
Условия возникновения:
- Взаимное исключение (ресурс занят одним потоком).
- Удержание и ожидание (поток держит ресурс и ждёт другой).
- Отсутствие вытеснения (ресурс нельзя отобрать).
- Циклическое ожидание (замкнутая цепочка потоков).
Пример:
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с таймаутом. - Отказ от вложенных блокировок.