notify用于唤醒一个等待线程,使其重新检查资源条件;必须配合while循环与状态更新使用,适用于一对一协作场景,多线程竞争时需谨慎以防饥饿。

notify 方法在简单信号量实现中,用于唤醒一个因资源不足而阻塞的等待线程,从而推动资源分配流程继续执行。
通知单个等待线程恢复执行
信号量的核心是控制对有限资源的访问。当一个线程尝试获取信号量(即执行 P 操作)但当前许可数为 0 时,它必须等待。此时调用 wait() 进入等待池,并释放锁;而另一个线程在释放资源(执行 V 操作)后调用 notify(),就是从该等待池中随机挑选一个线程,将其移入锁竞争队列——这表示“有资源空出来了,你可以回来试试”。
- notify 不保证唤醒特定线程,只唤醒任意一个符合条件的等待者
- 它不重置信号量值,只是触发等待线程重新检查条件(如许可是否可用)
- 若多个线程在等,且仅用 notify,可能造成部分线程长期得不到唤醒(饥饿)
必须配合 while 循环与条件判断
notify 本身不验证条件是否真正满足。被唤醒的线程需再次进入同步块,重新检查资源状态,否则可能出现虚假唤醒或逻辑错误。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:两个生产者都在 wait,消费者调用 notify 后只唤醒其一;若该线程不重新判断缓冲区是否已满,就直接写入,会越界
- 因此标准写法是:while (!condition) { obj.wait(); },而不是 if
- notify 应紧随状态更新之后、同步块结束前调用,确保唤醒时条件已变更
与 notifyAll 的适用区别
在简单二元信号量(如互斥锁)或一对一协作场景(如交替打印)中,notify 足够高效;但在多生产者-多消费者或资源数量可变的通用信号量中,notifyAll 更稳妥。
立即学习“Java免费学习笔记(深入)”;
- notify 适合“唤醒一个即可”的情形,比如只有一个空槽,只需唤醒一个生产者
- notifyAll 适合“所有等待者都应重试条件”的情形,比如多个消费者都在等数据,来一条就该全员检查
- 简单信号量若仅维护一个计数值且每次只增减 1,notify 可用;但若支持批量 acquire/release,建议优先用 notifyAll
它不是独立工作的机制,而是 wait/notify 协作模型中负责“触发重检”的一环,关键在于状态变更、等待、唤醒、再校验这一闭环是否严密。

















