0

0

Java并发编程中的公平性对吞吐量的影响_性能压测数据分析

P粉602998670

P粉602998670

发布时间:2026-03-08 14:44:03

|

179人浏览过

|

来源于php中文网

原创

java并发编程中的公平性对吞吐量的影响_性能压测数据分析

公平锁在高争用场景下吞吐量明显下降

公平锁(ReentrantLock(true))强制线程按入队顺序获取锁,避免饥饿但引入额外调度开销。压测中常见现象是:QPS 比非公平模式低 30%–60%,尤其在线程数 > CPU 核心数、临界区短(70% 的场景下更明显。

  • 公平性依赖 CLH queue 维护等待节点,每次 acquire 都需 CAS 更新 tail,争用激烈时失败重试增多
  • 线程唤醒后不能立即执行,必须等前序所有排队线程都轮到——导致 CPU 利用率下降、上下文切换增加
  • 非公平锁(默认)允许新线程“插队”尝试 CAS 获取锁,成功则跳过排队,对缓存行友好,也更贴合真实负载的突发性

压测时如何验证公平性带来的性能差异

别只看平均延迟,重点观察 P99 延迟毛刺和线程阻塞率。用 JFR 或 jstack 抓样,搜索 parking to wait for 可快速定位是否大量线程卡在 AQS 队列里。

  • 对比实验必须固定线程数、总请求数、JVM 参数(尤其是 -XX:+UseParallelGC-XX:+UseZGC 要一致),否则 GC 干扰会掩盖锁行为
  • JMH 写微基准测试时,确保 @Fork(jvmArgsAppend = "-XX:-OmitStackTraceInFastThrow"),避免异常优化干扰锁路径
  • 生产级压测建议用 arthas thread -n 10 查看 top 10 阻塞线程堆栈,确认是否集中阻塞在 AbstractQueuedSynchronizer.acquire

公平锁不是“更安全”,它只是换了一种不安全的方式

很多人误以为公平锁能防止死锁或提升一致性,其实它既不改变原子性,也不影响可见性。它只调整调度策略,反而可能暴露原本被非公平性掩盖的问题。

SekoTalk
SekoTalk

商汤科技推出的AI对口型视频创作工具

下载
  • 比如多个锁嵌套时,公平模式更容易触发循环等待(因严格 FIFO,线程推进节奏更同步)
  • 若业务逻辑本身存在“先锁 A 再锁 B”的隐式顺序,公平锁会让线程更大概率卡在同一个位置,放大锁顺序问题
  • tryLock(long, TimeUnit) 在公平模式下返回 false 的概率更高——不是因为锁不可用,而是因为队列太长,超时前根本轮不到

什么情况下真该用公平锁

只有两类场景值得考虑:确定性响应时间要求(如实时系统),或调试/复现偶发竞争问题。除此之外,默认用非公平锁。

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

  • 实时系统需 P99 延迟稳定在 5ms 内,且能接受吞吐量折损——此时公平性带来可预测性,比绝对吞吐更重要
  • 用公平锁复现 ConcurrentModificationException 或数据不一致 bug,因为它的执行顺序更可控、更容易重现
  • 注意:Synchronized 永远是非公平的,且 JVM 8u60+ 后已无公平开关;不要试图通过它模拟公平行为
实际压测中,最常被忽略的是锁粒度与公平性的耦合效应——把一个本该拆成多个细粒度锁的操作,强行套上公平锁,结果吞吐崩盘还查不出原因。公平性解决不了设计问题,它只会让设计缺陷更快暴露。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

435

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

435

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

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

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

763

2023.08.10

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

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

98

2025.12.01

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

501

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

292

2023.08.07

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

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

46

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号