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