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 подскажет развёрнутый ответ в реальном времени.