0
我在理解Oracle教程中的這個特定死鎖示例時遇到了問題。 我認爲我對死鎖是什麼有一個很好的想法(我已經看到了很多的例子,其中兩個最終的對象鎖創建,一個線程獲得第一個和第二個),但這個似乎更復雜。棘手的死鎖示例
爲什麼無法在不阻止程序的情況下調用bowBack()方法?如果方法同步於這個 - 如果我理解正確,這實際上是同步方法的工作方式 - 然後線程不共享資源,這會導致它們彼此等待。
是因爲如果你試圖在另一個同步方法中調用一個同步方法,你需要在這個外部方法中是「唯一的線程」?
從我收集,他們都進入弓()同時所有的罰款,直到bowBack()被調用......
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();
}
}