发布于2026-07-09 阅读(0)
扫一扫,手机访问
Condition通过解耦锁与等待条件实现精准并发调度,支持多条件队列、细粒度唤醒、可中断超时及定制化状态机。

Condition 对象的核心思路,是把“锁”和“等待条件”彻底拆开。这一拆,线程协作的粒度就精细多了。它的作用远不止是替换掉传统的 wait/notify ——实际上,它重新定义了线程之间如何等待、如何唤醒、如何响应。
一个 ReentrantLock 可以创建多个 Condition 实例,每个实例对应一个独立的业务条件。举个例子,在线程池中:
notEmpty 条件:工作线程只在这个条件上调用 await() 等待。notFull 条件:提交线程只在这个条件上等待。这样一来,新任务到达时只需调用 notEmpty.signal(),唤醒的正好是等待消费的工作线程;扩容或清空后调用 notFull.signal(),影响的也只是提交线程。传统 notifyAll() 带来的“惊群效应”和虚假唤醒,就这么被避开了。
signal() 和 signalAll() 两种唤醒方式,可以根据任务优先级或资源状态灵活选择:
signal() 只唤醒一个空闲线程,上下文切换开销更小。signalAll() 快速激活所有待命线程。await(long, TimeUnit) 设置超时,线程不会无限期挂起,系统的韧性自然更强。Condition 必须依附于 Lock,这恰恰让它能天然利用 Lock 的可中断、可超时、公平性等能力:
await() 可被 interrupt() 中断,便于任务取消或超时熔断。tryLock() 加上 await() 的组合,实现“尝试获取锁→条件不满足则等待”的柔性调度。signal() 唤醒的线程会按等待顺序竞争锁,调度行为完全可以预测。因为等待/通知不绑定固定语义,开发者可以自由定义条件的含义。例如:
awaitUntil(Date) 实现定时唤醒,用于周期性检查或延迟任务投递。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8