首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >爪哇:永远等待着

爪哇:永远等待着
EN

Stack Overflow用户
提问于 2013-10-05 08:49:09
回答 1查看 183关注 0票数 0

考虑以下执行语句:

(1)线程A:检查特定的锁状态并失败(2)线程A:因此尝试进入等待状态(3)线程B:使用特定任务完成并修改线程A (4)线程B:信号notifyAll()所需的锁状态

考虑一下,如果Java的VM重新排序代码以按以下顺序执行(1)、(3)、(4)、(2)。我相信这样的条件是可能的,在这种情况下,可能会出现问题,因为线程A将永远等待状态,因为没有其他线程要通知!

编辑1:我不是为了锁定而使用同步块。相反,我使用AtomicInteger来获得一段代码的锁。考虑一个RWLock类,它有一个原子变量N。随着进入锁状态的读取器和写入器的数量增加或减少。这个问题适用于这种情况,而不是同步块/方法。

EN

回答 1

Stack Overflow用户

发布于 2013-10-05 08:55:38

如果您正在使用wait()/notifyAll()模式,那么您应该在两个调用周围对锁对象进行同步。这防止了你建议的重新排序。

例如

代码语言:javascript
复制
private final Object lock = new Object();

public void waiting()
{
  sychronized (lock)
  {
    while (waitCondition)
      lock.wait();
  }
}

public void notifying()
{
  sychronized (lock)
  {
    // change wait condition, probably

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

https://stackoverflow.com/questions/19195806

复制
相关文章

相似问题

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