countdownlatch基于aqs共享模式实现,state作为倒计数器;await()在state>0时入队阻塞,countdown()通过cas递减state,减至0后批量唤醒所有等待线程;不可重用且无超时重置机制。

CountDownLatch 的等待逻辑完全基于 AQS(AbstractQueuedSynchronizer)的共享模式实现,核心是通过 AQS 的 state 字段表示剩余计数,线程调用 await() 时若 state > 0 就进入同步队列阻塞等待。
state 作为倒计数器
AQS 的 state 变量被直接用作计数值:构造时传入的 count 被设为初始 state;每次调用 countDown() 就执行 CAS 原子递减;当 state 变为 0,说明所有前置任务完成。
await() 触发共享式获取失败并入队
调用 await() 本质是尝试以共享模式获取同步状态:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 底层调用 AQS 的 acquireSharedInterruptibly(1)(忽略参数 1,实际只关心 state 是否为 0)
- 若当前 state == 0,直接返回,不阻塞
- 若 state > 0,AQS 执行标准流程:构造 Node 加入同步队列 → 挂起线程 → 等待被唤醒
countDown() 成功释放后唤醒等待者
每次 countDown() 调用 releaseShared(1):
- 先调用 tryReleaseShared(int) —— CountDownLatch 的实现中,它不断 CAS 尝试将 state 减 1,直到成功
- 一旦 state 减至 0,doReleaseShared() 被触发,遍历同步队列,唤醒所有处于共享模式等待的节点
- 被唤醒的线程重新检查 state,此时为 0,于是从 await() 返回
注意点:不可重用 & 无超时的阻塞语义
CountDownLatch 是一次性门闩:
- state 一旦到 0,后续 await() 立即返回,不会再次阻塞
- 没有“重置”机制,也不提供类似 tryAcquireNanos 的超时支持(超时版需用 await(long, TimeUnit))
- 所有等待线程共享同一 state,唤醒是批量的,不是逐个通知
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










