CountDownLatch是否受到虚假唤醒的影响?

时间:2015-07-22 21:04:44

标签: java multithreading countdownlatch

等待/通知和锁定/条件等并发管理机制似乎受spurious wakeups的影响。开发人员通过重新检查条件确实发生变化来满足那些意外的唤醒。

说到CountDownLatch,虚假的唤醒是一个问题吗?

2 个答案:

答案 0 :(得分:10)

CountDownLatch#await()州的javadoc

  

如果当前计数大于零则为当前线程   因线程调度而被禁用,直到休眠为止   发生以下两件事之一:

     
      
  • 由于countDown()方法的调用,计数达到零;或
  •   
  • 其他一些线程会中断当前线程。
  •   

休眠意味着该方法不会返回。换句话说,虽然可能发生虚假唤醒,但它不会导致await方法返回。

您可以查看implementation以了解这是如何完成的,但简而言之,它是循环的典型技巧,并且等待" (通过LockSuport#parkObject#wait受到虚假唤醒的影响),直到满足条件。

  

说到CountDownLatch,虚假的唤醒是一个问题吗?

没有

答案 1 :(得分:3)

Object.wait/Condition.await方法受到“虚假唤醒”的影响。

await中的CountDownLatch方法将等到

  • 由于countDown()方法的调用,计数达到零; 或其他一些线程中断当前线程;或指定的 等待时间过去了。

所以即使发生虚假的唤醒,由于计数尚未达到,它也不会再回来。

因此CountDownLatchCyclicBarrier等同步器不会受到虚假唤醒的影响。