Mediumdeadlock

Что такое deadlock и как его избежать?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Deadlock — потоки ждут ресурсы друг друга бесконечно. Классика: поток A держит M1, ждёт M2; поток B держит M2, ждёт M1.

Поток A: lock(M1) → ждёт lock(M2) ─┐
Поток B: lock(M2) → ждёт lock(M1) ─┘  взаимная блокировка

Условия Коффмана: mutual exclusion, hold and wait, no preemption, circular wait. Чтобы избежать:

  • ordering — всегда брать locks в одном порядке (по id/hash);
  • tryLock(timeout)ReentrantLock.tryLock(), откатиться при неудаче;
  • избегать вложенных locks; не держать lock при вызове внешнего кода;
  • использовать higher-level: BlockingQueue, CompletableFuture.

Detection: jstack, jconsole, ThreadMXBean.findDeadlockedThreads(). Livelock — потоки активны, но не прогрессируют; starvation — поток не получает CPU/ресурсов.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.