Junior — Middle
შესაძლოა გახდეს მეხსიერების გაჟონვა ან ურთიერთბლოკირება, თუ ორი თრეილი დაბლოკილია ერთმანეთის მონიტორების განთავისუფლების მოლოდინში?
sobes.tech AI
პასუხი AI-სგან
Да, такая ситуация называется взаимной блокировкой (deadlock). Если два потока (или более) заблокированы, ожидая освобождения мониторов (замков) друг друга, они не смогут продолжить работу, так как каждый ждет ресурс, удерживаемый другим.
Это не утечка памяти, но приводит к зависанию программы, так как потоки не освобождают ресурсы и не завершаются.
Пример классической взаимной блокировки:
Object lock1 = new Object();
Object lock2 = new Object();
Thread t1 = new Thread(() -> {
synchronized(lock1) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized(lock2) {
// работа
}
}
});
Thread t2 = new Thread(() -> {
synchronized(lock2) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized(lock1) {
// работа
}
}
});
t1.start();
t2.start();
Здесь t1 захватывает lock1 и ждет lock2, а t2 захватывает lock2 и ждет lock1 — возникает взаимная блокировка.