以下是Java中原子等待的翻译。
这里while
的需求是什么? if
不足够吗?
///<await (condition) statements; >
synchronized(obj)
{
while ( !condition)
{
obj.wait();
}
statements;
}
答案 0 :(得分:4)
实际上有两个理由需要它。
首先,如果监视器所有者调用notifyAll()
,则所有等待的线程会一个接一个地被唤醒,所以如果之前的一个线程改变了这个条件,那么你对它的假设将不再是真的。
第二个原因是Spurious wakeup。由于大多数JVM实现依赖于操作系统线程模型,并且其中一些允许虚假唤醒(为了性能),您需要准备好这样的情况。
答案 1 :(得分:3)
您需要while
,因为有人向您发送了notify
并不意味着条件现在是真的(或者仍然是真的)。
所有notify
确实(或者应该这样做)告诉等待的线程(其中可能有很多,有不同的条件等待,即使在同一台监视器上)现在也是一个好时机重新评估他们是否还需要wait
。