首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >死锁行为,有3个线程具有等待和通知

死锁行为,有3个线程具有等待和通知
EN

Stack Overflow用户
提问于 2016-09-27 00:33:04
回答 1查看 120关注 0票数 0

我有三根线,三条线都在做“.”(例如,写信给一份清单,我们在其中同步):

代码语言:javascript
复制
public void run(){
  long time= System.currentTimeMillis();
  while(System.currentTimeMillis - time < 10000){
    synchronized(object){
      [...]
      object.notifyAll();
      object.wait();
    }
  }
  System.out.println(Thread.currentThread.getName() + " just finished");
}

我发现奇怪的是,当一个线程退出while-循环时,就会出现死锁。我的问题不是它发生了,因为这正是我所测试的,而是它发生的时候。死锁不应该在两个线程完成之后发生吗?因为还有一个线程不能由两个线程中的任何一个来通知?

当然,有可能两个线程同时调用它们的“等待”,所以在一个线程完成后就会出现死锁,因为两个等待线程不能被已完成的线程唤醒,但是我已经多次运行测试,结果总是一样的:只完成一个线程之后的死锁。

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 00:37:29

无论是否需要等待,wait函数都会等待。在调用wait之前,您必须检查您想要等待的东西是否已经发生--这就是您处于synchronized块中的原因,以便您持有保护您正在等待的共享状态的锁。

如果没有等待到达特定状态的共享状态,wait/notifyAll将永远无法工作。您必须使用锁来保护该共享状态,并且必须在调用wait之前检查其状态。否则,你总是会有可能的比赛,包括你所看到的比赛,即使事情已经发生,你也在等待它的发生,因此你将永远等待。

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

https://stackoverflow.com/questions/39714351

复制
相关文章

相似问题

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