下面是直接來自Sun教程描述死鎖的代碼。然而,我不明白在這種情況下死鎖是如何發生的,因爲這兩種方法都是同步的。兩個線程如何同時在同一個同步方法中?關於來自太陽的死鎖教程的問題
死鎖描述了一個情況,其中兩個或多個線程永遠被阻塞,彼此等待。這是一個例子。
阿爾方斯和加斯頓是朋友,並且是禮貌的好信徒。嚴格的禮貌規則是,當你向朋友鞠躬時,你必須保持鞠躬,直到你的朋友有機會歸還弓。不幸的是,這條規則沒有考慮到兩個朋友可能同時向對方低頭的可能性。這個示例應用程序,死鎖,模型這種可能性:
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
死鎖時運行,這是非常有可能的是,當他們嘗試調用bowBack兩個線程將被阻塞。這兩個塊都不會結束,因爲每個線程都在等待另一個線程退出低頭。
可能重複的[嘗試包裹我的周圍大腦如何線程死鎖](http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock ) –