Java:wait(),notify()和嵌套的synchronized块

时间:2015-02-24 00:25:43

标签: java multithreading

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

主题1:

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

主题2(稍后):

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

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

2 个答案:

答案 0 :(得分:1)

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

synchronized (globalLock)

因为线程1从未出现过synchronized (globalLock)

答案 1 :(得分:1)

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

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();
}