Вопрос проверяет понимание классических проблем многопоточности и причин полной остановки выполнения потоков.
Deadlock — это ситуация, когда несколько потоков навсегда блокируют друг друга, ожидая освобождения ресурсов. Каждый поток удерживает ресурс и ждет другой, который занят другим потоком. В результате ни один поток не может продолжить выполнение. Программа при этом не падает, но перестает выполнять полезную работу. Это одна из самых опасных ошибок многопоточности.
Deadlock возникает из-за неправильного управления блокировками.
Deadlock — это состояние, при котором:
поток A удерживает ресурс X и ждет ресурс Y
поток B удерживает ресурс Y и ждет ресурс X
ни один поток не может продолжить выполнение
Все участники находятся в вечном ожидании.
Типичный сценарий:
один поток захватывает lock1
второй поток захватывает lock2
каждый пытается получить второй lock
Пример:
synchronized (lock1) {
synchronized (lock2) {
// недостижимо
}
}
Deadlock возможен при одновременном выполнении условий:
взаимное исключение
удержание и ожидание
отсутствие принудительного освобождения
циклическое ожидание
Основные подходы:
фиксированный порядок захвата блокировок
минимизация времени удержания lock’ов
использование tryLock
отказ от вложенных блокировок
Вывод: deadlock полностью останавливает выполнение потоков и требует осознанного проектирования синхронизации.