我在Oracle的Java tutorial中找到了以下示例。
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();
}
}
他们声称当Deadlock运行时,两个线程在尝试调用bowBack时很可能会阻塞。两个块都不会结束,因为每个线程都在等待另一个线程退出弓。但是我不明白,当Bow()是一个Synchronized方法时,一次只有一个线程可以访问它。因此其他线程在线程访问时无法访问Bow()。使用Bow()的线程不会释放Bow()上的锁,直到BowBack()的响应回来。 然后他们如何期待死锁发生?我对Deadlock的理解是当Synchronized Method A依赖于方法B时,反之亦然。并且Thread1在A()和B()上的Thread2上锁定,发生死锁。 但是,任何人都可以解释该示例如何解释死锁场景吗?