Ответ
Поток, участвующий в 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).