问题描述
案例
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class 虚假唤醒问题 {
private static final Object room = new Object();
private static boolean hasCigarette = false;
private static boolean hasTakeOut = false;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
synchronized (room){
log.debug("小南进入房间");
while(!hasCigarette){
try {
log.debug("有烟没?[{}]",hasCigarette);
room.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("有烟没?[{}]",hasCigarette);
if(hasCigarette){
log.debug("小南正常干活");
}
}
},"小南").start();
new Thread(() -> {
synchronized (room){
log.debug("小女进入房间");
while(!hasTakeOut){
try {
log.debug("外卖到了没?[{}]",hasTakeOut);
room.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("外卖到了没?[{}]",hasTakeOut);
if(hasTakeOut){
log.debug("小女正常干活");
}
}
},"小女").start();
Thread.sleep(2000);
synchronized (room){
hasTakeOut = true;
log.debug("外卖送到了");
room.notifyAll();
}
}
}
结果展示:
23:24:44.195 [小南] DEBUG 虚假唤醒问题 - 小南进入房间
23:24:44.200 [小南] DEBUG 虚假唤醒问题 - 有烟没?[false]
23:24:44.202 [小女] DEBUG 虚假唤醒问题 - 小女进入房间
23:24:44.202 [小女] DEBUG 虚假唤醒问题 - 外卖到了没?[false]
23:24:46.194 [main] DEBUG 虚假唤醒问题 - 外卖送到了
23:24:46.194 [小女] DEBUG 虚假唤醒问题 - 外卖到了没?[true]
23:24:46.194 [小女] DEBUG 虚假唤醒问题 - 小女正常干活
23:24:46.194 [小南] DEBUG 虚假唤醒问题 - 有烟没?[false]