Sobes.tech
Back to questions
Middle — Middle+
67

Создайте пример кода, который приведет к взаимной блокировке потоков без возможности их освобождения.

Companies where asked
ЯндексЯндекс

Answer from AI

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.

Если оба потока успевают захватить свои первые блокировки до того, как второй захватит вторую, возникает взаимная блокировка — каждый поток ждет освобождения ресурса, который удерживает другой, и программа зависает.