在SharedVariable类场景下,能否用notify()替代notifyAll()?
能否将
.notifyAll()替换为.notify()? 先贴出原代码:
public class SharedVariable<T> { private T value; public SharedVariable(T init){ this.value = init; } public synchronized void testAndSet(Predicate<? super T> p, T value) throws InterruptedException{ while (!p.test(this.value)){ this.wait(); this.value = value; } this.notifyAll(); } }
答案是不能直接替换,替换后大概率会引发线程饥饿甚至死锁问题,具体原因如下:
- 核心机制差异:
notify()只会随机唤醒当前对象等待队列中的单个线程,而notifyAll()会唤醒队列里所有处于等待状态的线程。 - 多线程场景下的风险:当多个线程因
!p.test(this.value)条件不满足而进入等待时:- 若用
notify(),每次仅唤醒一个线程。如果被唤醒的线程再次检查条件仍不成立(比如其他线程已修改value,导致该线程的Predicate依旧不满足),它会重新进入等待。 - 此时可能存在其他线程的条件已经满足,但始终没被唤醒的情况,这些线程会一直卡在等待队列里无法继续执行,也就是线程饥饿。
- 极端情况下,如果每次唤醒的都是条件不满足的线程,所有等待线程都会陷入永久等待,直接引发死锁。
- 若用
- 原方法的设计逻辑:
testAndSet的作用是当条件满足时更新value并通知其他线程,这种多线程等待同一条件变更的场景,必须用notifyAll()确保所有等待线程都有机会重新检查条件,避免遗漏。
内容的提问来源于stack exchange,提问作者Marsh
相关产品推荐
相关产品推荐

