首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: wait()、notify()和嵌套的同步块

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

Stack Overflow用户
提问于 2015-02-24 08:25:43
回答 2查看 354关注 0票数 2

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

线程1:

代码语言:javascript
复制
synchronized (globalLock) {
  synchronized (o) {
    o.wait();
  }
}

线程2(稍后):

代码语言:javascript
复制
synchronized (globalLock) {
  synchronized (o) {
    o.notify();
  }
}

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

EN

回答 2

Stack Overflow用户

发布于 2015-02-24 08:37:50

正如评论中提到的,这很容易测试。是的,它确实会因为你猜到的原因而死锁。

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2015-02-24 08:29:47

当线程1在Thread2之前启动时会出现死锁。线程2永远不能执行它的:

代码语言:javascript
复制
synchronized (globalLock)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28686202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档