java中condition的核心优势在于解耦“等待条件”与“锁对象”,支持单锁多等待队列、精准唤醒、安全临界区控制、while循环防虚假唤醒、中断/超时响应及与lock深度协同。

Java 中 Condition 的核心优势,在于它把“等什么条件”和“用哪把锁”解耦了,让线程唤醒不再靠猜,而是精准点名。
一个锁,多个等待队列
传统 synchronized + wait/notify 只能绑定一个对象监视器,所有等待线程挤在同一个队列里。一旦 notifyAll(),生产者和消费者全被唤醒,再抢锁、再判断、再挂起——白白消耗资源。
Condition 允许一个 ReentrantLock 创建多个 Condition 实例,比如:
- notEmpty:专供消费者等待“有数据可取”
- notFull:专供生产者等待“有空位可放”
生产者完成入队后调 notEmpty.signal(),只唤醒消费者;消费者出队后调 notFull.signal(),只唤醒生产者。互不干扰,避免惊群。
唤醒逻辑更可控、更安全
signal() 不会释放锁,也不打断当前执行流,只负责“发通知”,行为明确;而 await() 进入等待前自动释放锁,被唤醒后必须重新竞争锁,天然保证临界区安全。
更重要的是:必须用 while 循环检查条件,不能用 if。因为存在虚假唤醒(spurious wakeup),线程可能没被 signal 就醒过来。循环重检能兜住这种边界情况。
支持中断与超时,响应性更强
Condition 提供了更丰富的等待方式:
-
await():可响应中断,适合需主动取消的场景 -
awaitNanos(long)或await(long, TimeUnit):带超时,避免无限等待 -
awaitUntil(Date):按绝对时间点控制等待截止 -
awaitUninterruptibly():屏蔽中断,适合关键路径
这些能力是 Object.wait() 所不具备的,让线程协作更具韧性。
与 Lock 深度协同,语义更清晰
Condition 必须由 Lock 实例创建(如 lock.newCondition()),天然绑定锁生命周期。整个流程围绕 lock → condition → await/signal 展开,代码意图一目了然;不像 wait/notify 需依赖 synchronized 块内 this 锁,容易因锁对象错配引发死锁或失效。
配合 try-finally 确保 unlock,再嵌套 while + await,结构规整,错误率更低。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











