Condition通过解耦锁与等待条件实现精准并发调度,支持多条件队列、细粒度唤醒、可中断超时及定制化状态机。
Condition 对象通过解耦“锁”与“等待条件”,让并发任务调度更精准、更可控。它不只替代了 wait/notify,而是从根本上重构了线程协作的粒度和响应逻辑。
一个 ReentrantLock 可创建多个 Condition 实例,每个对应独立的业务条件。比如在线程池中:
notEmpty 条件:工作线程只在此条件上 await()
notFull 条件:提交线程只在此条件上等待这样,新任务到达时调用 notEmpty.signal(),只会唤醒工作线程;扩容或清空后调用 notFull.signal(),只影响提交线程。彻底规避传统 notifyAll() 带来的“惊群效应”和虚假唤醒。
Condition 提供 signal() 和 signalAll() 两种唤醒方式,可根据任务优先级或资源状态动态选择:
立即学习“Java免费学习笔记(深入)”;
signal() 唤醒单个空闲线程,减少上下文切换开销signalAll() 快速激活所有待命线程await(long, TimeUnit) 设置超时,防止线程无限期挂起,增强系统韧性Condition 必须依附于 Lock,这也让它天然支持可中断、可超时、公平性等能力:
await() 可被 interrupt() 中断,便于任务取消或超时熔断tryLock() + await() 组合,实现“尝试获取锁→条件不满足则等待”的柔性调度策略signal() 唤醒的线程按等待顺序竞争锁,保障调度可预测性Condition 的等待/通知不绑定固定语义,开发者可自由定义条件含义。例如:
awaitUntil(Date) 实现定时唤醒,用于周期性检查或延迟任务投递