Oracle Java教程中的DeadLock示例令人困惑

时间:2016-02-09 18:18:45

标签: java multithreading deadlock

我在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上锁定,发生死锁。 但是,任何人都可以解释该示例如何解释死锁场景吗?

0 个答案:

没有答案