Я хочу знать, разрешено ли исключать блокировки резьбы, не создавая ниток одновременно? Есть ли другой способ избежать взаимоблокировок в следующем коде?Предупреждение о взаимоблокировке тупика
Заранее благодарен!
public class ThreadDeadlocks {
public static Object Lock1 = new Object();
public static Object Lock2 = new Object();
public static void main(String args[]) {
ThreadDemo1 t1 = new ThreadDemo1();
ThreadDemo2 t2 = new ThreadDemo2();
t1.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
t2.start();
}
private static class ThreadDemo1 extends Thread {
public void run() {
synchronized (Lock1) {
System.out.println("Thread 1: Holding lock 1...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (Lock2) {
System.out.println("Thread 1: Holding lock 1 & 2...");
}
}
}
}
private static class ThreadDemo2 extends Thread {
public void run() {
synchronized (Lock2) {
System.out.println("Thread 2: Holding lock 2...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println("Thread 2: Waiting for lock 1...");
synchronized (Lock1) {
System.out.println("Thread 2: Holding lock 1 & 2...");
}
}
}
}
}
Как правило, 'sleep()' никогда не может _fix_ проблему параллелизма. Что он может сделать, это может сделать проблему гораздо менее вероятной. Это нормально для демонстраций, обучения и личного использования; но если вы строите программное обеспечение для производства, то, что он переводит, это превращает ошибку, которая была бы поймана при тестировании на ошибку, которая не будет происходить до тех пор, пока месяцы или годы спустя, на сайте клиента, и которые к тому времени, будет практически невозможно диагностировать. –