Java代码是否会导致信号丢失?若会,原因是什么?
这段Java代码是否会导致信号丢失?
结论:这段代码不会导致信号丢失
原因分析:
- 所有涉及共享状态
conditionMet的读写操作,以及wait()/notify()的调用,都在持有lock锁的同步块内执行,保证了操作的原子性和可见性。 - 当
signalCondition()方法执行时,必须先获取lock锁才能修改conditionMet并发送通知。这意味着它不可能插入到waitForCondition()方法中“检查conditionMet为false”到“调用lock.wait()释放锁”的间隙里——因为此时lock还被waitForCondition()持有,signalCondition()无法执行,也就不会出现“条件已设置但通知没被等待线程收到”的情况。 - 代码中使用
while (!conditionMet)循环而非if判断,是为了处理虚假唤醒(线程未收到通知就被唤醒)的场景,重新检查条件能确保只有当条件真正满足时才继续执行,但这是处理虚假唤醒的机制,和信号丢失无关。
代码回顾
private Object lock = new Object(); private boolean conditionMet = false; public void waitForCondition() throws InterruptedException { synchronized (lock) { while (!conditionMet) { lock.wait(); } // Proceed when condition is met } } public void signalCondition() { synchronized (lock) { conditionMet = true; lock.notify(); } }
内容的提问来源于stack exchange,提问作者user1918858
相关产品推荐
相关产品推荐

