在Java中实现原子等待

时间:2010-12-08 05:43:45

标签: java multithreading

以下是Java中原子等待的翻译。 这里while的需求是什么? if不足够吗?

///<await (condition) statements; > 

synchronized(obj)
{ 
      while ( !condition) 
      { 
         obj.wait();
      }
      statements;
}

2 个答案:

答案 0 :(得分:4)

实际上有两个理由需要它。

首先,如果监视器所有者调用notifyAll(),则所有等待的线程会一个接一个地被唤醒,所以如果之前的一个线程改变了这个条件,那么你对它的假设将不再是真的。

第二个原因是Spurious wakeup。由于大多数JVM实现依赖于操作系统线程模型,并且其中一些允许虚假唤醒(为了性能),您需要准备好这样的情况。

答案 1 :(得分:3)

您需要while,因为有人向您发送了notify并不意味着条件现在是真的(或者仍然是真的)。​​

所有notify确实(或者应该这样做)告诉等待的线程(其中可能有很多,有不同的条件等待,即使在同一台监视器上)现在也是一个好时机重新评估他们是否还需要wait