Ответ
Нет, deadlock сам по себе не вызывает исключений. Это ситуация логической ошибки, при которой два или более потока бесконечно ожидают друг друга, освободив заблокированные ресурсы. JVM не рассматривает это как исключительную ситуацию (Exception), поэтому программа просто зависает (перестаёт прогрессировать).
Пример классического deadlock:
final Object lock1 = new Object();
final Object lock2 = new Object();
new Thread(() -> {
synchronized (lock1) { // Поток 1 захватывает lock1
Thread.sleep(100);
synchronized (lock2) { } // Ждёт, пока освободится lock2
}
}).start();
new Thread(() -> {
synchronized (lock2) { // Поток 2 захватывает lock2
Thread.sleep(100);
synchronized (lock1) { } // Ждёт, пока освободится lock1 -> DEADLOCK
}
}).start();
Как обнаружить deadlock? Поскольку исключение не выбрасывается, для диагностики используются внешние средства:
- Инструменты JDK: Утилита
jstack <PID>выведет дамп потоков и укажет на обнаруженные взаимные блокировки. - Мониторинг через JMX.
- Профилировщики и IDE.
Профилактика: Избегайте deadlock, устанавливая фиксированный порядок захвата блокировок или используя более высокоуровневые средства синхронизации из java.util.concurrent.