You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:54:12