什么是线程虚假唤醒

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

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

6个回答

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

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

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

如果采用操作系统调用才实现限时、可中断的api则不会有这样的问题

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

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

wait方法用这种方式是有问题,非wait的阻塞接口可以这样实现

立即提问