虚假唤醒
https://blog.csdn.net/qq_39455116/article/details/87101633
当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用的唤醒;
比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁。
解决方法:防止虚假唤醒,wait()应该放在循环中,当线程被唤醒时再进行一次条件判断,直到满足条件才进行下一步。
synchronized (obj) {
while (econdition does not hold>)
obj.wait(timeout) ;
... 1/ Perform action appropriate to condition
}