线程的虚假唤醒是什么意思?求大神指导

虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该唤醒的。

意思是还有其他方法能唤醒wait()方法?
图片说明

为什么用while就能避免虚假唤醒呢?

2个回答

其他方法不能唤醒wait()方法。

用while的时候,是利用了线程的Interrupted一个标记,终端了循环条件,从而控制线程。

WittySq
WittySq 那虚假唤醒 到底说的是什么呢? 大神求解
接近 4 年之前 回复

虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该唤醒的。

解决的办法是基于while来反复判断进入正常操作的临界条件是否满足:

synchronized (obj) {     //此处只是个同步代码块,不再是整个方法
        while (<condition does not hold>)  
            obj.wait();  
        ... // Perform action appropriate to condition  
    } 

如何修复问题?

#1. 使用可同步的数据结构来存放数据,比如LinkedBlockingQueue之类。由这些同步的数据结构来完成繁琐的同步操作。

#2. 双层的synchronized使用没有意义,保留外层即可。

#3. 将if替换为while,解决虚假唤醒的问题。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐