Java:wait()、notify()和嵌套的同步块



这会起作用还是导致死锁?

线程1:

synchronized (globalLock) {
  synchronized (o) {
    o.wait();
  }
}

线程2(稍后):

synchronized (globalLock) {
  synchronized (o) {
    o.notify();
  }
}

所以据我所知,o.wait()会释放o的锁,但它会释放globalLock的锁吗?可能不会,这会导致僵局吗?

正如评论中提到的,这非常容易测试。是的,由于你猜测的原因,它确实陷入僵局。

public static void main(String[] args) throws InterruptedException {
  final Object globalLock = new Object();
  final Object o = new Object();
  new Thread(new Runnable() {
    @Override
    public void run() {
      synchronized (globalLock) {
        synchronized (o) {
          try {
            System.out.println("waiting");
            o.wait();
          } catch (InterruptedException ie) {
            // no-op
          }
        }
      }
    }
  }).start();
  Thread.sleep(2000); // ensure thread above starts first
  new Thread(new Runnable() {
    @Override
    public void run() {
      synchronized (globalLock) {
        synchronized (o) {
          System.out.println("notifying");
          o.notify();
        }
      }
    }
  }).start();
}

线程1在线程2之前启动时出现是死锁。线程2将永远无法执行其:

synchronized (globalLock)

因为线程1从未从synchronized (globalLock) 中出来

最新更新