讲师中心 微信公众号
AI工具推荐 视频效率加速

Java怎么模拟并发请求 Java使用CountDownLatch压测【技巧】

夜伟同学_1495

夜伟同学_1495

发布时间:2026-02-16 08:31:02

|

567人浏览过

|

来源于php中文网

原创

CountDownLatch通过await()阻塞主线程、各工作线程完成准备后调用countDown(),计数归零时统一唤醒实现同步发请求;需避免重复创建、异常未countDown、误用为可重用屏障,并注意HttpClient线程安全与连接池配置。

java怎么模拟并发请求 java使用countdownlatch压测【技巧】

CountDownLatch 怎么让线程等齐了再一起发请求

CountDownLatch 不是为“压测”设计的,但它能解决「所有线程准备好后同时发起请求」这个关键前提。核心是 countDown() 和 await() 的配合:主线程调用 await() 阻塞,每个工作线程执行完准备动作后调用 countDown();当计数归零,所有等待线程被唤醒——此时时间点基本一致。

容易踩的坑:

  • 把 CountDownLatch 放在循环里反复 new,导致每次 await 都没对应足够的 countDown,线程永远卡住
  • 忘记在 try-catch 中调用 countDown(),异常抛出后计数不减,主线程死等
  • 误用 CyclicBarrier 场景(比如需要重复复位),但 CountDownLatch 是一次性门闩,不可重用

模拟并发请求时怎么避免 HttpClient 被复用污染

多个线程共用一个 CloseableHttpClient 实例是安全的,但若手动设置了 cookie、header 或连接池参数,就可能互相干扰。尤其压测中常需携带不同 token 或用户标识,必须在线程内独立构造或克隆上下文。

实操建议:

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

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 不要全局单例 HttpClient 后直接改 header——改用 HttpUriRequestBase#setHeader() 在每次请求对象上设
  • 如果要用 cookie,别依赖 CookieStore 全局实例,而是在每个线程里 new 一个 BasicCookieStore 并绑定到 HttpClient 实例
  • 连接池要调大:PoolingHttpClientConnectionManager 的 setMaxTotal(200) 和 setDefaultMaxPerRoute(50) 得显式设置,否则默认只有 2 个连接,大量线程会排队阻塞

为什么用 CountDownLatch 做压测结果不准

CountDownLatch 只保证“开始时间趋近一致”,不控制请求发出后的执行节奏。真实压测中,你看到的 TPS 低、响应时间高,往往不是因为并发没起来,而是:

  • JVM 预热不足:前几十次请求慢,影响平均值——应先预热再正式计时
  • 没有排除 GC 毛刺:加 -XX:+PrintGCDetails 看日志,频繁 Young GC 会让线程停顿
  • 忽略了网络栈限制:Linux 默认 net.ipv4.ip_local_port_range 是 32768–65535,最多约 3w 个临时端口,开 1w 线程+短连接会快速耗尽,报 java.net.BindException: Address already in use

真正做压测,CountDownLatch 只适合写 demo 或小规模验证;上生产级压测得用 JMeter、wrk 或 Gatling。

一个可直接跑的最小并发请求示例(含异常防护)

以下代码片段聚焦「可靠触发 + 安全释放」,去掉业务逻辑也能看出结构重点:

int threadCount = 100;
CountDownLatch ready = new CountDownLatch(threadCount);
CountDownLatch start = new CountDownLatch(1);
CountDownLatch done = new CountDownLatch(threadCount);

for (int i = 0; i < threadCount; i++) {
    new Thread(() -> {
        try {
            ready.countDown(); // 告诉主线程:我准备好了
            start.await();     // 等统一发令
            // ? 这里放你的 HTTP 请求逻辑
            HttpResponse res = httpClient.execute(new HttpGet("http://localhost:8080/api/test"));
            EntityUtils.consume(res.getEntity());
        } catch (Exception e) {
            // 记录错误,但必须确保 done 计数器减少
        } finally {
            done.countDown();
        }
    }).start();
}

ready.await(); // 等所有线程进入 await 状态
start.countDown(); // 发号施令
done.await(); // 等所有请求结束

注意 ready.await() 和 done.await() 之间才是真正的“压测窗口”,中间那段才是你要统计耗时、成功率的地方。漏掉这层区分,测出来的就是线程启动时间,不是接口性能。

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

11459

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1026

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

784

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1866

2025.08.19

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

13026

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1565

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3517

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

5681

2024.03.01

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn