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

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

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

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

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

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

虚假唤醒就是一些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,解决虚假唤醒的问题。

_**@

```

```**_