Java:永远等待Thead

时间:2013-10-05 08:49:09

标签: java multithreading wait notify compare-and-swap

考虑以下执行语句:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

例如

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