Sobes.tech
Middle — Middle+
122

Erstellen Sie ein Codebeispiel, das zu einer gegenseitigen Blockierung von Threads führt, ohne sie freizugeben.

Unternehmen wurden gefragt
ЯндексЯндекс

Antwort von AI

sobes.tech KI

Ниже пример кода на 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.

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