0

0

Java并发编程中如何使用CountDownLatch实现压力测试启动开关_同步控制

P粉602998670

P粉602998670

发布时间:2026-03-08 12:40:02

|

797人浏览过

|

来源于php中文网

原创

countdownlatch用作压测启动开关时,需构造参数为1,所有工作线程调await()阻塞,主控线程调countdown()统一放行;它不可重用、无就绪回调,且await被中断后须恢复中断状态。

java并发编程中如何使用countdownlatch实现压力测试启动开关_同步控制

CountDownLatch怎么让所有线程等一个信号才开始跑

CountDownLatch 做压力测试的“启动开关”,核心就两步:构造时设为 1,所有工作线程调用 await() 阻塞,主控线程最后调一次 countDown()。它不是锁,不涉及竞争资源,只管“数归零就放行”。

常见错误是把 CountDownLatchCyclicBarrier 混用——后者适合多轮重复同步,而压测通常只要一轮齐发;还有人误以为 await() 能被中断后自动重试,其实一旦抛出 InterruptedException,线程就退出了,得自己处理恢复逻辑。

  • 构造参数必须是 1(不是线程数),否则起不到“统一开关”作用
  • 每个工作线程必须在真正执行业务逻辑前调用 await(),不能漏、不能晚
  • 主控线程调 countDown() 前,要确保所有工作线程已进入 await() 状态,否则可能漏掉部分线程

为什么不能用Thread.sleep()或volatile布尔变量代替

Thread.sleep(100) 看似简单,但精度差、易漂移,100ms 内总有线程提前或滞后执行,压测结果抖动大;volatile boolean 看似轻量,却无法保证“所有线程看到 true 的那一刻,都刚好准备好执行”,存在竞态:有的线程读到 true 后立刻执行,有的还在初始化数据库连接。

CountDownLatch 的底层依赖 AQS 的 park()/unpark(),能精确控制线程挂起与唤醒时机,且 await() 是可响应中断的阻塞,比自旋或休眠更省资源。

立即学习Java免费学习笔记(深入)”;

Q.AI视频生成工具
Q.AI视频生成工具

支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI

下载
  • volatile 变量无法阻塞线程,需配合循环轮询,浪费 CPU
  • Thread.sleep() 时间不可控,尤其在高负载机器上误差常超 ±20ms
  • CountDownLatchawait(long, TimeUnit) 还能防死锁,超时后可主动报错退出

压测场景下CountDownLatch.await()被中断怎么办

压测脚本常需要支持 Ctrl+C 中断,这时主线程可能被 interrupt(),导致工作线程在 await() 时抛出 InterruptedException。不处理的话,线程直接退出,压测数据不全,还可能留下未关闭的连接。

正确做法是在捕获异常后,显式恢复中断状态,并决定是否继续执行业务逻辑——多数压测框架选择“中止当前线程”,但得确保资源清理(如关闭 HTTP 客户端)。

  • 必须调用 Thread.currentThread().interrupt() 恢复中断标记,否则上层无法感知中断
  • 不要在 catch 块里吞掉异常又不恢复中断,这是最常见也最隐蔽的坑
  • 如果压测允许“部分线程执行”,可在 catch 后直接运行业务逻辑,但需记录 warn 日志说明偏差
try {
    latch.await();
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 关键!
    log.warn("Thread interrupted before test start");
    return;
}
// 此处才开始发请求

和Phaser、CyclicBarrier比,CountDownLatch在压测里有什么硬伤

CountDownLatch 最大的限制是“一次性”:计数器归零后,后续调用 await() 会立即返回,无法重复用于多轮压测。如果你要做“预热 → 正式压测 → 再压测”这种流程,每次都要 new 一个新的实例,而 PhaserCyclicBarrier 支持重置。

另外,它不提供“到达屏障点”的回调,没法在所有线程就位时自动打印日志或采集系统指标——得靠主控线程在 countDown() 前手动加日志,容易遗漏。

  • 多轮压测必须重建 CountDownLatch 实例,注意别复用已触发过的对象
  • 没有内置的“就绪通知”机制,想统计就绪线程数,得自己维护 AtomicInteger
  • Android 或老版本 JDK(
压测启动同步看着简单,但线程就绪时机、中断传播、多轮复用这几个点,稍不留意就会让并发量虚高或数据残缺。尤其是中断处理那行 Thread.currentThread().interrupt(),漏掉它,整个压测脚本就变成“看起来能停,实际停不干净”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

763

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

763

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

98

2025.12.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

384

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2108

2023.08.14

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

44

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.9万人学习

Java 教程
Java 教程

共578课时 | 78.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号