猿问

什么是线程虚假唤醒

JAVA文档上有提到线程虚假唤醒的概念,但是解释的不是明了

请问如何理解线程虚假唤醒?在什么情况下会发生?


动漫人物
浏览 952回答 6
6回答

慕婉清6462132

虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该返回的,所以要加条件判断。如下是一个很好的代码实践:[code]synchronized (obj) {while ()obj.wait();... // Perform action appropriate to condition}[/code]

海绵宝宝撒

A thread wake upwithout being notified, interrupted, or timing out, is so-called spurious wakeup

喵喔喔

有一个情形就会,很多阻塞的api采用轮询的方式来监测是否有中断调用,在轮询过程中,线程从活动到休眠,又从休眠到活动,如此往复的检查中断,但是从整个api的角度来看,这个线程是处于休眠状态,但是用Thread相关方法判断,则可能会出现线程是alive的如果采用操作系统调用才实现限时、可中断的api则不会有这样的问题

慕斯709654

楼上所说,这种实现是会出问题的,因为在轮询切换时,可能会漏掉notify的中断,从而无休止的休眠下去。

holdtom

[quote]这种实现是会出问题的,因为在轮询切换时,可能会漏掉notify的中断,从而无休止的休眠下去。[/quote]wait方法用这种方式是有问题,非wait的阻塞接口可以这样实现
随时随地看视频慕课网APP

相关分类

Java
我要回答