notify本身不提升并发响应能力,但能通过精准唤醒减少无谓竞争、配合while条件检查防虚假唤醒、与synchronized协同保障执行有序性,从而在合适场景下实现更高效低延迟的线程协作。

notify 方法本身不直接“提升并发响应能力”,但它能帮助构建更高效、低延迟的协作逻辑,前提是用得对、用得稳。
精准唤醒,减少无谓竞争
当多个线程在同一个对象上 wait 时,notify 只唤醒其中一个——这避免了 notifyAll 带来的“惊群效应”。比如单消费者场景下,生产者发一个数据,只需唤醒一个等待的消费者即可。其余线程继续休眠,不参与锁竞争,CPU 和上下文切换开销明显降低。
- 适合一对一协作模型(如简单队列、信号量控制)
- 比 notifyAll 更轻量,尤其在线程数较多但每次只处理一项任务时优势明显
- 但必须确保被唤醒的线程确实能推进工作,否则可能造成“唤醒浪费”甚至饥饿
配合 while 条件检查,支撑可靠状态驱动
notify 的价值真正发挥出来,依赖于“条件等待”模式:线程不是盲目等待,而是在 while 循环中反复校验业务条件是否满足。一旦被 notify 唤醒,立刻重检条件——这既防虚假唤醒,也保证只在真正可执行时才继续。
- 例如:库存扣减前检查 available > 0,唤醒后仍需验证,避免超卖
- 这种模式让线程响应更贴近业务节奏,而不是靠轮询或固定延时,响应更及时、资源更节省
与 synchronized 协同,实现可控的执行流转
notify 必须在 synchronized 块内调用,且唤醒动作发生在持有锁期间。这意味着:通知发出后,被唤醒线程不会立刻执行,而是等当前线程释放锁后,再竞争进入——整个流程天然串行化、可预测。
立即学习“Java免费学习笔记(深入)”;
- 避免了“通知早于状态更新完成”导致的逻辑错乱
- 结合锁的语义,使线程协作具备原子性边界,系统行为更稳定
- 相比无锁编程或纯 volatile 配合 busy-wait,它在中低并发下更省电、更易维护
注意边界:它不是万能加速器
notify 不增加吞吐量,也不缩短单次操作耗时。它的作用是让等待线程“该醒的时候醒,不该醒的时候睡”,从而减少空转和争抢。滥用或误用反而拖慢系统:
- 在多消费者或多生产者场景下只用 notify,容易漏唤醒,导致部分线程永久阻塞
- 没配 while 循环检查条件,可能因虚假唤醒执行错误逻辑
- 脱离同步块调用,直接抛 IllegalMonitorStateException,程序崩溃


















