В каком состоянии находится поток Java при возникновении Deadlock?

«В каком состоянии находится поток Java при возникновении Deadlock?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поток, участвующий в deadlock (взаимной блокировке), технически находится в состоянии BLOCKED (при использовании synchronized) или WAITING/TIMED_WAITING (при использовании Lock, wait(), Condition.await()).

Почему BLOCKED? Поток заблокирован, ожидая монитор (вход в synchronized-блок), который удерживается другим потоком. JVM не выделяет отдельного состояния для deadlock.

Object lockA = new Object();
Object lockB = new Object();

Thread t1 = new Thread(() -> {
    synchronized (lockA) {          // t1 захватывает lockA
        Thread.sleep(100);
        synchronized (lockB) {} // t1 БЛОКИРОВАН (BLOCKED), ожидая lockB от t2
    }
});

Thread t2 = new Thread(() -> {
    synchronized (lockB) {          // t2 захватывает lockB
        Thread.sleep(100);
        synchronized (lockA) {} // t2 БЛОКИРОВАН (BLOCKED), ожидая lockA от t1
    }
});

// Оба потока запускаются и зависают в состоянии BLOCKED — это deadlock.
t1.start();
t2.start();

Как обнаружить: Используйте jstack, ThreadMXBean.findDeadlockedThreads() или средства мониторинга (VisualVM, JConsole).