我正在通过oracle文档进行死锁..我找到了这段代码
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();
}
}
我不明白,在什么情况下会发生死锁?
我运行此代码,它工作正常。因此必须有一些特殊事件,何时会发生死锁?
假设alphonse首先在对象上调用bow
,那么alphonse当bower.bowBack(this)在bower对象上调用bow时,它会在对象上保持锁定吗?因为如果它保留其锁定,则bow另一个对象上的函数只有保持其锁定状态才能获得alphonse锁定,并且永远不会出现死锁情况。