Получить доступ

Что такое deadlock и как его предотвращать?

MiddleМногопоточность
Коротко

Deadlock — циклическое ожидание: поток A держит замок 1 и ждёт замок 2, поток B держит 2 и ждёт 1. Предотвращают единым порядком захвата, tryLock с таймаутом и откатом, короткими критическими секциями без вызова чужого кода под замком.

  • Четыре условия Коффмана: взаимное исключение, удержание с ожиданием, нет отбора, цикл
  • Найти — дамп потоков (jstack): «Found one Java-level deadlock»
  • Сам не разрешается: потоки стоят вечно

А ещё Livelock — потоки активны, но уступают друг другу без прогресса

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Взаимная блокировка двух потоков

Подробно

Классический пример — перевод денег:

void transfer(Account from, Account to, int sum) {
    synchronized (from) {
        synchronized (to) { ... }
    }
}
// поток 1: transfer(a, b)   поток 2: transfer(b, a) → взаимная блокировка

Условия взаимоблокировки (все четыре одновременно): ресурс используется монопольно; поток держит одно и ждёт другое; ресурс нельзя отобрать; ожидание образует цикл. Достаточно сломать любое.

Способы предотвращения:

  • глобальный порядок захвата — например, по id счёта: сначала меньший; цикла не возникнет;
  • tryLock с таймаутом (ReentrantLock): не получилось — отпустить захваченное и повторить позже;
  • не вызывать чужой код под замком — колбэк может захватить неизвестные замки;
  • один замок вместо нескольких, или структуры без блокировок.

Диагностика: jstack <pid> или дамп из VisualVM — JVM сама находит цикл среди мониторов и ReentrantLock и печатает, кто кого ждёт. Программно — ThreadMXBean.findDeadlockedThreads().

Родственные проблемы: livelock (потоки бесконечно уступают друг другу), starvation (поток никогда не получает ресурс).

Что хотят услышать

  • Определение и пример.
  • Условия возникновения.
  • Порядок захвата, tryLock, отсутствие чужого кода под замком.
  • Как найти в работающем приложении.

Частые ошибки

  • Надеяться, что JVM разорвёт взаимоблокировку сама.

Что спросят дальше

  • Как получить thread dump?
  • Чем deadlock отличается от livelock?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем