为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的虚假唤醒真的发生了吗?

Java中的虚假唤醒真的发生了吗?

海绵宝宝撒 2019-08-15 15:08:37
Java中的虚假唤醒真的发生了吗?看到各种锁定相关的问题和(几乎)总是找到'循环因为虚假的唤醒'术语1我想知道,有没有人经历过这样的唤醒(假设一个像样的硬件/软件环境)?我知道“虚假”一词意味着没有明显的理由,但这种事件的原因是什么?(1注意:我不是在质疑循环练习。)编辑:一个帮助问题(对于那些喜欢代码示例的人):如果我有以下程序,我运行它:public class Spurious {     public static void main(String[] args) {         Lock lock = new ReentrantLock();         Condition cond = lock.newCondition();         lock.lock();         try {             try {                 cond.await();                 System.out.println("Spurious wakeup!");             } catch (InterruptedException ex) {                 System.out.println("Just a regular interrupt.");             }         } finally {             lock.unlock();         }     }}await如果不等待随机事件,我该怎样做才能虚假地唤醒它?
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

回答titile中的问题 - 是的!它确实发生了。尽管维基文章提到了一个关于虚假唤醒的大量协议,但我遇到的一个很好的解释如下 -

想一想......就像任何代码一样,线程调度程序可能会因底层硬件/软件中发生异常而暂时停电。当然,应该注意尽可能少地发生这种情况,但是由于没有100%强大的软件这样的事情,所以假设这种情况可能发生并且在调度程序检测到这种情况时需要注意优雅的恢复(例如,通过观察失踪的心跳)。

现在,调度程序如何恢复,考虑到在停电期间它可能会错过一些旨在通知等待线程的信号?如果调度程序什么都不做,那么提到的“不幸”线程就会挂起,永远等待 - 为了避免这种情况,调度程序只会向所有等待的线程发送一个信号。

这使得有必要建立一个“合同”,即无需理由就可以通知等待线程。确切地说,有一个原因 - 调度程序停电 - 但由于线程被设计(有充分理由)无法调度内部实现细节,因此这个原因可能更好地呈现为“虚假”。

我正在从Source阅读这个答案,并认为它足够合理。还看了

Java中的虚假唤醒以及如何避免它们

PS:以上链接是我的个人博客,其中包含有关虚假唤醒的其他详细信息。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 1113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信