Назад к вопросам
Яндекс
Middle — Middle+
66
Создайте пример кода, который приведет к взаимной блокировке потоков без возможности их освобождения.
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Ниже пример кода на Java, демонстрирующий взаимную блокировку (deadlock) между двумя потоками, которые пытаются захватить два объекта-монитора в разном порядке:
public class DeadlockExample {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
System.out.println("Thread 1 захватил lock1");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (lock2) {
System.out.println("Thread 1 захватил lock2");
}
}
}
public void method2() {
synchronized (lock2) {
System.out.println("Thread 2 захватил lock2");
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (lock1) {
System.out.println("Thread 2 захватил lock1");
}
}
}
public static void main(String[] args) {
DeadlockExample example = new DeadlockExample();
Thread t1 = new Thread(example::method1);
Thread t2 = new Thread(example::method2);
t1.start();
t2.start();
}
}
В этом примере:
- Поток 1 захватывает
lock1, затем пытается захватитьlock2. - Поток 2 захватывает
lock2, затем пытается захватитьlock1.
Если оба потока успевают захватить свои первые блокировки до того, как второй захватит вторую, возникает взаимная блокировка — каждый поток ждет освобождения ресурса, который удерживает другой, и программа зависает.