Sobes.tech
Junior — Middle

Czy zdarzały się sytuacje, gdy napotykałeś na wzajemne blokady procesów w systemach?

sobes.tech AI

Odpowiedź od AI

Tak, zakleszczenie wzajemne (deadlock) to sytuacja, gdy dwa lub więcej procesów lub wątków na zawsze oczekuje na zwolnienie zasobów od siebie nawzajem.

W Java może się to zdarzyć przy niewłaściwym użyciu synchronizacji, na przykład gdy dwa wątki próbują przejąć dwa obiekty monitor w różnej kolejności.

Przykład:

Object lock1 = new Object();
Object lock2 = new Object();

Thread t1 = new Thread(() -> {
    synchronized(lock1) {
        try { Thread.sleep(100); } catch (InterruptedException e) {}
        synchronized(lock2) {
            // praca
        }
    }
});

Thread t2 = new Thread(() -> {
    synchronized(lock2) {
        try { Thread.sleep(100); } catch (InterruptedException e) {}
        synchronized(lock1) {
            // praca
        }
    }
});

t1.start();
t2.start();

Aby uniknąć deadlocku, ważne jest przestrzeganie kolejności przejmowania blokad i minimalizowanie czasu trzymania zasobów.