0

考虑以下执行语句:

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

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

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

4

1 回答 1

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();
  }
}
于 2013-10-05T08:55:38.803 回答