Deadlocked - мир зомби
Deadlock - это ситуация в многопоточном программировании, когда два или более потока блокируются, ожидая друг друга для выполнения действий, необходимых для завершения программы. Это может произойти, если каждый поток занят ожиданием ресурсов, которые удерживает другой поток.
Рассмотрим пример кода, который может привести к deadlock'у:
java
public class DeadlockExample {
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
public void run() {
synchronized(lock1) {
System.out.println("Thread 1: Acquired lock 1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lock2) {
System.out.println("Thread 1: Acquired lock 2");
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
public void run() {
synchronized(lock2) {
System.out.println("Thread 2: Acquired lock 2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lock1) {
System.out.println("Thread 2: Acquired lock 1");
}
}
}
});
thread1.start();
thread2.start();
}
}
В данном примере мы имеем два потока, которые блокируются при попытке получить блокировку другого объекта. Когда первый поток пытается получить блокировку lock2, он не может этого сделать, потому что она уже занята вторым потоком. В то же время, второй поток пытается получить блокировку lock1, которую удерживает первый поток.
В результате оба потока ожидают блокировки другого объекта, и программа зависает в состоянии deadlock'a.
Для того, чтобы избежать deadlock'а, необходимо обращать особое внимание на порядок использования блокировок, так чтобы потоки не конкурировали за одни и те же ресурсы в разном порядке.