等待/通知和锁定/条件等并发管理机制似乎受到虚假唤醒的影响。开发人员通过重新检查条件是否确实发生了变化来应对这些意外唤醒。
当谈到 CountDownLatch 时,虚假唤醒是一个问题吗?
等待/通知和锁定/条件等并发管理机制似乎受到虚假唤醒的影响。开发人员通过重新检查条件是否确实发生了变化来应对这些意外唤醒。
当谈到 CountDownLatch 时,虚假唤醒是一个问题吗?
CountDownLatch#await()
各州的 javadoc
如果当前计数大于零,则当前线程出于线程调度目的而被禁用并处于休眠状态,直到发生以下两种情况之一:
- 由于
countDown()
方法的调用,计数达到零;或者- 其他一些线程中断当前线程。
休眠意味着该方法不会返回。换句话说,虽然可能会发生虚假唤醒,但它不会导致await
方法返回。
您可以查看实现以了解这是如何完成的,但简而言之,这是循环和“等待”(通过LockSuport#park
或Object#wait
受虚假唤醒影响)直到满足条件的典型技巧。
当涉及到 时
CountDownLatch
,虚假唤醒是一个问题吗?
不。
这些Object.wait/Condition.await
方法会受到“虚假唤醒”的影响。
中的await
方法CountDownLatch
将等到
因此即使发生虚假唤醒,由于计数未达到,它也不会返回。
CountDownLatch
所以像, etc这样的同步CyclicBarrier
器不会受到虚假唤醒的影响。