9

等待/通知和锁定/条件等并发管理机制似乎受到虚假唤醒的影响。开发人员通过重新检查条件是否确实发生了变化来应对这些意外唤醒。

当谈到 CountDownLatch 时,虚假唤醒是一个问题吗?

4

2 回答 2

14

CountDownLatch#await()各州的 javadoc

如果当前计数大于零,则当前线程出于线程调度目的而被禁用并处于休眠状态,直到发生以下两种情况之一:

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

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

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

当涉及到 时CountDownLatch,虚假唤醒是一个问题吗?

不。

于 2015-07-22T21:16:25.237 回答
4

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

中的await方法CountDownLatch将等到

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

因此即使发生虚假唤醒,由于计数未达到,它也不会返回。

CountDownLatch所以像, etc这样的同步CyclicBarrier器不会受到虚假唤醒的影响。

于 2015-07-22T21:23:09.473 回答