countdownlatch在测试中用于精准模拟并发负载,支持统一触发、等待完成及两阶段同步:用countdownlatch(1)实现严格同步发起,countdownlatch(n)统计耗时与成功率,组合多个实例完成预热-爆发-收尾流程,并需注意finally调用countdown、不复用实例、线程池容量充足及合理设超时。

CountDownLatch 在测试中常用于精准模拟多线程并发负载,尤其适合验证系统在高并发下的响应能力、资源竞争行为或接口吞吐瓶颈。它不追求“真实用户行为”,而是提供可控、可复现的并发起点和同步终点,让测试逻辑清晰、结果可度量。
控制并发起点:统一发令枪
要模拟 N 个请求同时打到服务端(如压测登录接口),关键不是“几乎同时”,而是“严格同步触发”。这时可初始化 CountDownLatch(1):
- 主线程启动所有工作线程后,先不放行,只调用
latch.await()让它们全部挂起在同一起跑线; - 待所有线程就位(可通过
getCount()或简单计数确认),主线程再执行一次latch.countDown(); - 瞬间唤醒全部线程,实现毫秒级对齐的并发发起。
等待全部完成:统计真实耗时与成功率
发起负载后,需准确知道“N次请求整体耗时”以及“成功/失败数量”。此时用 CountDownLatch(N) 更自然:
- 每个工作线程执行完自己的请求(含异常捕获、结果记录)后,立即调用
latch.countDown(); - 主线程调用
latch.await(timeout, TimeUnit.SECONDS)等待全部结束,超时则中断并标记失败; - 结束后汇总 List
,计算平均响应时间、错误率、TP99 等指标。
组合使用:两阶段同步更贴近真实场景
复杂负载测试常需“预热→爆发→收尾”三阶段。可搭配两个 CountDownLatch 实现:
- 预热阶段:用 latchWarmup 控制 5 个线程预热连接池、缓存等,全部完成后才进入下一阶段;
- 爆发阶段:用 latchBurst 控制 100 个线程严格并发请求,并用另一个 latchDone 等待它们全部返回;
- 这样既能隔离预热干扰,又能精确测量核心负载窗口的性能表现。
注意事项:避免常见陷阱
实际编写测试代码时需注意:
- 务必在工作线程的
finally块中调用countDown(),防止异常导致计数器卡死; - 不要复用同一个 CountDownLatch 实例做多次测试,它是一次性的,每次新测试都应 new 一个;
- 若用线程池执行任务,确保线程池容量 ≥ 并发线程数,否则部分线程会排队,破坏并发意图;
- await() 超时值不宜过短,需覆盖最慢请求的合理上限,否则误判为失败。











