CountDownLatch 是一次性同步工具,用于协调多个线程等待条件完成;创建计数为 N 的实例,各线程调用 await() 阻塞,裁判调用 countDown() 触发全部唤醒,支持超时与中断处理。

CountDownLatch 是 Java 并发包中用于协调多个线程等待某个条件完成的同步工具,非常适合模拟“所有运动员就位后统一发令起跑”这种场景。
用 CountDownLatch 模拟起跑线等待
核心思路是:创建一个计数为 N 的 CountDownLatch,每个运动员线程启动后先执行准备动作(如热身),再调用 await() 阻塞等待;裁判线程在所有运动员就绪后,调用 countDown() 一次或多次,直到计数归零,所有 await() 线程同时被唤醒——就像发令枪响,所有人起跑。
关键代码结构
以下是一个简洁可运行的示例逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 初始化 CountDownLatch latch = new CountDownLatch(5)(假设有 5 名运动员)
- 每个运动员线程:执行准备 → latch.await() → 起跑(开始计时/执行任务)
- 裁判线程:休眠模拟发令延迟 → latch.countDown()(只需调用一次,即可释放全部等待者)
注意线程安全与典型陷阱
CountDownLatch 是一次性使用的,计数归零后无法重置。如果需要重复起跑(比如多轮比赛),应每次新建实例。
立即学习“Java免费学习笔记(深入)”;
- 不要在运动员线程中漏掉 await(),否则可能提前起跑
- 避免裁判过早调用 countDown(),应在确认所有运动员已启动并进入 await 状态后再触发
- 可配合 Thread.sleep() 或日志输出验证执行顺序,确保“等待→发令→并发执行”流程清晰
扩展:支持超时等待和异常处理
实际场景中,若某运动员迟迟未就位,不能无限等待。可用带超时的 await(long timeout, TimeUnit unit):
- 返回 true 表示成功等到发令;返回 false 表示超时,可做降级处理(如取消该运动员参赛)
- await() 可能被中断,需捕获 InterruptedException 并合理响应(如恢复中断状态)


















