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.