CountDownLatch计数器归零时自动唤醒所有await()线程,基于AQS实现:countDown()使state原子减1,为0时doReleaseShared()唤醒同步队列中所有等待线程,await()返回后线程处于RUNNABLE态并立即执行后续逻辑。

CountDownLatch 计数器归零时,所有调用 await() 的线程会自动被唤醒,无需手动触发。 这是 CountDownLatch 的核心机制 —— 它内部基于 AQS(AbstractQueuedSynchronizer)实现,计数器减到 0 后,会释放共享锁,唤醒所有在同步队列中阻塞的等待线程。
计数器归零即自动唤醒,不依赖 notify 或 interrupt
CountDownLatch 不使用 Object 的 wait()/notify(),也不依赖线程中断。它的唤醒完全由 AQS 控制:
- 每次
countDown()都尝试将 state(计数器)原子减 1 - 当 state 变为 0 时,AQS 调用
doReleaseShared(),遍历并唤醒所有因await()而挂起的线程 - 被唤醒的线程会重新检查 state,发现为 0 后直接从
await()返回,继续执行后续代码
await() 返回后线程状态是正常运行态,不是新建或阻塞态
调用 await() 的线程在被唤醒后:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 不会抛出 InterruptedException(除非它在等待过程中被中断)
- 不会处于 TIMED_WAITING 或 WAITING 状态,而是进入 RUNNABLE 状态
- 可立即执行
await()后面的逻辑,例如启动任务、打印日志、合并结果等
多次 await() 是安全的,计数器归零后所有后续 await() 立即返回
CountDownLatch 是一次性门闩(不可重置),但它的设计保证了线程安全性:
立即学习“Java免费学习笔记(深入)”;
- 计数器归零后,再调用
await()会立刻返回(因为 state == 0) - 多个线程同时在计数器归零前后调用
await(),全部能正确获得通知 - 不需要额外同步措施,底层 AQS 已保障可见性和有序性
常见误用提醒:别在归零后还试图 countDown()
虽然 countDown() 在计数器为 0 后继续调用是安全的(无副作用),但属于逻辑冗余:
- state 保持为 0,不会变负,也不会报错
- 但可能掩盖业务逻辑错误(比如误以为还有未完成的任务)
- 建议配合日志或断言,确保
countDown()次数与预期一致

















