2025.4.29 虚假唤醒
虚假唤醒(Spurious Wakeup)
虚假唤醒是指线程在调用wait()方法后,即使没有被notify()或notifyAll()唤醒,也可能自行醒来。这种现象是操作系统或JVM层面的优化导致的,并非程序逻辑错误,但会影响多线程程序的正确性。
为什么会出现虚假唤醒?
操作系统/JVM优化:某些系统(如Linux)的线程调度机制可能导致wait()提前返回,即使没有显式通知。
性能考虑:完全避免虚假唤醒可能增加锁竞争的开销,因此Java规范允许其存在,开发者需自行处理。
如何避免虚假唤醒?
解决方案:用while代替if。
java
复制代码
public synchronized void increment() throws InterruptedException {
while (number != 0) { // 用while循环检查条件
this.wait(); // 唤醒后会重新检查
}
number++;
}
关键点:
线程被唤醒后,会重新检查while条件,如果条件仍不满足,继续等待。
确保只有满足条件时才会执行后续逻辑。