Два потока захватывают lockA/lockB в противоположном порядке. Чтобы демонстрация не зависела от случайного планирования, синхронизируйте их после захвата первого монитора.
Создание классической взаимоблокировки в Java
Два потока захватывают lockA/lockB в противоположном порядке. Чтобы демонстрация не зависела от случайного планирования, синхронизируйте их после захвата первого монитора.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Показать типичный сценарий deadlock‑ситуации, когда два потока навечно находятся в ожидании друг друга, захватив разные мониторы в противоположном порядке.
public class DeadLockDemo {
private static final Object lockA = new Object();
private static final Object lockB = new Object();
public static void main(String[] args) {
Thread t1;
Thread t2;
}
}
Ответ
Два потока захватывают lockA/lockB в противоположном порядке. Чтобы демонстрация не зависела от случайного планирования, синхронизируйте их после захвата первого монитора.
В main:
var barrier = new java.util.concurrent.CyclicBarrier(2);
Thread t1 = new Thread(() -> block(lockA, lockB, barrier));
Thread t2 = new Thread(() -> block(lockB, lockA, barrier));
t1.start();
t2.start();
В классе:
static void block(Object first, Object second,
java.util.concurrent.CyclicBarrier barrier) {
synchronized (first) {
try { barrier.await(); }
catch (Exception e) { throw new RuntimeException(e); }
synchronized (second) { System.out.println("Not reached"); }
}
}
При нормальной работе без прерывания барьера возникает цикл ожидания. Пример намеренно зависает и предназначен только для изолированного запуска. Единый порядок блокировок устраняет эту причину deadlock.