class BadPerson {
public synchronized void say(GoodPerson good) {
System.out.println("把錢給我,放了你的人。");
good.give();
}
public synchronized void give() {
System.out.println("得到了錢,同時被警察抓了。");
}
}
class GoodPerson {
public synchronized void say(BadPerson bad) {
System.out.println("把我的人放了,我給你錢。");
bad.give();
}
public synchronized void give() {
System.out.println("人救回來,同時報案了。");
}
}
public class LockDeadDemo implements Runnable {
private BadPerson bad = new BadPerson();
private GoodPerson good = new GoodPerson();
public LockDeadDemo() {
new Thread(this).start() ;
good.say(bad); //new Thread(new LockDeadDemo()).start() ;
}
public void run() {
bad.say(good);
}
public static void main(String[] args) {
// new Thread(new LockDeadDemo()).start() ;
new LockDeadDemo();
}
}
以上程序,請問,命名bad.give()和good.give()這2同步方法都只調用了一次,為什麼還是鎖死。
例如調用bad.give()方法時,難道還有別的線程也在調用此方法,導致鎖死嗎.
你這段代碼中本質上是存在兩個線程的:main方法所在的是一個線程,而main方法的new LockDeadDemo();操作創建了另外一個線程。
存在死鎖是因為good.say(bad)本質上是需要兩個鎖的,先獲取good對象,然後獲取參數bad對象鎖;而run()方法中的bad.say(good)也是需要兩個鎖,先獲取bad對象鎖,然後再試圖獲取good對象鎖。
這兩個線程同時以相反的加鎖順序獲取了對方需要的鎖,而又等待對方持有的鎖,這就導致這兩個線程陷入死鎖了,這是Java並發編程中典型的協作對象直接死鎖問題。
可以參考http://blog.csdn.net/wojiushiwo945you/article/details/45097371
這也可以歸結為鎖順序死鎖問題,參考http://blog.csdn.net/wojiushiwo945you/article/details/45092501