Создание классической взаимоблокировки в Java

Два потока захватывают lockA/lockB в противоположном порядке. Чтобы демонстрация не зависела от случайного планирования, синхронизируйте их после захвата первого монитора.

Короткий ответ

Что ответить на собеседовании

Два потока захватывают 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее