等待/通知和锁定/条件等并发管理机制似乎受spurious wakeups的影响。开发人员通过重新检查条件确实发生变化来满足那些意外的唤醒。
说到CountDownLatch,虚假的唤醒是一个问题吗?
答案 0 :(得分:10)
CountDownLatch#await()
州的javadoc
如果当前计数大于零则为当前线程 因线程调度而被禁用,直到休眠为止 发生以下两件事之一:
- 由于
countDown()
方法的调用,计数达到零;或- 其他一些线程会中断当前线程。
休眠意味着该方法不会返回。换句话说,虽然可能发生虚假唤醒,但它不会导致await
方法返回。
您可以查看implementation以了解这是如何完成的,但简而言之,它是循环的典型技巧,并且等待" (通过LockSuport#park
或Object#wait
受到虚假唤醒的影响),直到满足条件。
说到
CountDownLatch
,虚假的唤醒是一个问题吗?
没有
答案 1 :(得分:3)
Object.wait/Condition.await
方法受到“虚假唤醒”的影响。
await
中的CountDownLatch
方法将等到
所以即使发生虚假的唤醒,由于计数尚未达到,它也不会再回来。
因此CountDownLatch
,CyclicBarrier
等同步器不会受到虚假唤醒的影响。