CountDownLatch 的 countDown() 方法天然线程安全,基于 AQS 的 CAS 原子操作实现,无需 synchronized 或 ReentrantLock;每次调用执行 compareAndSetState 的 CPU 级原子指令,避免读-改-写竞态,100 次并发调用必精确归零。

CountDownLatch 的 countDown() 方法天然线程安全,不需要额外加锁。它不依赖 synchronized 或 ReentrantLock,而是靠底层原子操作实现。
核心机制:基于 AQS 的 CAS 原子更新
CountDownLatch 内部使用 AbstractQueuedSynchronizer(AQS)作为同步基础,其计数器就是 AQS 的 state 字段(volatile 修饰的 int)。每次调用 countDown(),实际执行的是:
- AQS 的 releaseShared(1) 方法
- 该方法最终调用 compareAndSetState(expect, update) —— 底层是 Unsafe 类的 CAS 指令
- CAS 是 CPU 级别的原子指令,一次完成“读-比-写”,失败则重试,对调用者完全透明
为什么不用外部同步也能安全并发调用
多个线程同时调用 countDown() 不会出现计数丢失或错乱,因为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次减一都是一个独立的 CAS 尝试,不存在“读取旧值 → 计算新值 → 写回”这种三步非原子过程
- 即使 10 个线程同时对 state=100 执行 countDown(),最终 state 必然精确变为 0(前提是调用次数足够)
- countDown() 是无副作用的幂等操作:重复调用不会抛异常,但业务逻辑中仍应避免误多次触发
验证它真安全的最简方式
不用看源码,直接跑一段竞态放大代码:
立即学习“Java免费学习笔记(深入)”;
- 初始化
CountDownLatch latch = new CountDownLatch(100); - 启 10 个线程,每线程循环调用 10 次
latch.countDown(); - 主线程调用
latch.await(1, TimeUnit.SECONDS) - 只要输出 ✅ 线程安全,就证明 100 次减操作全部生效、无竞争丢失
和普通变量自减的本质区别
如果换成 int shared = 100; 和 shared--;,同样 10×10 场景大概率出错——因为 -- 是非原子的三步操作;而 countDown() 是单次 CAS,JDK 已将其封装为“不可分割”的语义。

















