public class DeadlockDemo2 {
public static Object Lock1 = new Object();
public static Object Lock2 = new Object();
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadDemo1 demo1 = new ThreadDemo1();
ThreadDemo2 demo2 = new ThreadDemo2();
demo1.start();
demo2.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...");
}
}
}
}
}
В приведенной выше программе обе нитки спадают в течение 10 миллисекунд. Таким образом, как только время истекает, demo1 может получить блокировку lock2 и demo2 на lock1. Но этого не происходит. Они заходят в тупик.Поведение режима сна в синхронизированном блоке
Может ли кто-нибудь объяснить причину?
Заранее спасибо.
Спасибо за объяснение. Это действительно полезно. У меня просто одно сомнение, если нет сна(), это работает нормально. Даже в этом случае это не будет заторможено? –
Без сна теоретически возможно, что «ThreadDemo1» завершит всю свою работу до того, как «ThreadDemo2» даже начнет выполнение благодаря времени раскрутки нити и времени планирования. Это не значит, что вы удалили тупик, просто вам не хватает его. Если вместо этого вы замените сон какой-то более длинной единицей работы, вам нужно снова зайти в тупик. – aruisdante
ok. Благодарю. Я наткнулся на еще одну программу, которую я не могу вставить здесь. Http://www.journaldev.com/1058/deadlock-in-java-example. Если программа запущена, она не заканчивается. Если я изменил продолжительность сна, чтобы сказать 1000 мс от 30000 (который указан) в методе work(), все потоки выполняются один за другим. Я не понимаю, как сон влияет на результат здесь? Можете ли вы пролить свет на него? –