考虑以下执行语句:
(1)线程A:检查特定的锁状态并失败(2)线程A:因此尝试进入等待状态(3)线程B:使用特定任务完成并修改线程A (4)线程B:信号notifyAll()所需的锁状态
考虑一下,如果Java的VM重新排序代码以按以下顺序执行(1)、(3)、(4)、(2)。我相信这样的条件是可能的,在这种情况下,可能会出现问题,因为线程A将永远等待状态,因为没有其他线程要通知!
编辑1:我不是为了锁定而使用同步块。相反,我使用AtomicInteger来获得一段代码的锁。考虑一个RWLock类,它有一个原子变量N。随着进入锁状态的读取器和写入器的数量增加或减少。这个问题适用于这种情况,而不是同步块/方法。
发布于 2013-10-05 08:55:38
如果您正在使用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();
}
}https://stackoverflow.com/questions/19195806
复制相似问题