Java里如何使用LongAdder提升计数性能_Java高并发计数器原理解析

发布时间 - 2026-01-01 00:00:00    点击率:
LongAdder 比 AtomicLong 更快,因其采用分段累加+最终合并策略,通过 base 值与 cells 数组分散线程竞争,降低 CAS 自旋开销,吞吐量近似随 CPU 核心数线性增长。

在高并发场景下,用 LongAdder 替代 AtomicLong 能显著提升计数性能,核心在于它用“分段累加 + 最终合并”的思路,避免了多线程竞争同一变量带来的 CAS 自旋开销。

为什么 LongAdder 比 AtomicLong 更快?

AtomicLong 所有线程都争抢更新同一个 volatile 变量,高并发时大量 CAS 失败、重试,CPU 浪费严重;LongAdder 则内部维护一个 base 值 + 一个 cells 数组,每个线程优先尝试更新自己绑定的 cell,冲突概率大幅降低。

只有当 cells 初始化失败或扩容失败时,才退化为更新 base —— 这种“尽量分散、必要时兜底”的设计,让吞吐量随 CPU 核心数近似线性增长。

怎么正确使用 LongAdder?

用法极简,但要注意语义差异:

  • 初始化:LongAdder counter = new LongAdder();
  • 累加:counter.increment();counter.add(5);
  • 读取总和:counter.sum();(不是 get()!)
  • 重置计数:counter.reset();(清空 base 和所有 cell,比反复 new 更轻量)

⚠️ 注意:sum() 是非原子快照,不适合做严格条件判断(如“是否达到阈值”需额外同步);若需强一致性读写,仍应回归 AtomicLong

底层结构与关键细节

LongAdder 继承自 Striped64,核心字段包括:

  • transient volatile Cell[] cells;:哈希表式数组,长度为 2 的幂,每个元素是一个带 @Contended 的 long 单元,防伪共享(false sharing)
  • transient volatile long base;:基础值,cells 未初始化或争用激烈时的备用累加位置
  • transient volatile int cellsBusy;:自旋锁,控制 cells 初始化和扩容(仅用 0/1 表示是否被占用)

线程通过 ThreadLocalRandom.getProbe() 计算 hash,再与 cells.length-1 取模定位 cell;probe 值由线程私有且延迟初始化,天然具备隔离性。

适用场景与避坑提醒

适合:监控指标统计(QPS、错误数)、批量任务计数、限流器中的请求计数等——对实时性要求不高、但对吞吐敏感的累加场景。

不适合:

  • 需要原子读-改-写(如 compareAndSet)
  • 计数值要作为同步条件(如 while(counter.sum()
  • 极低并发(单线程或 2~3 线程),此时 AtomicLong 更轻量

小技巧:如果应用已用 AtomicLong,只需改三处 —— new、add、sum,基本就这些。


# java  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 使用spring连接及操作mongodb3.0实例  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  大同网页,大同瑞慈医院官网?  如何在局域网内绑定自建网站域名?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何使用Sanctum进行API认证?(SPA实战)  网站建设保证美观性,需要考虑的几点问题!  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Python制作简易注册登录系统  网站制作软件有哪些,制图软件有哪些?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  java ZXing生成二维码及条码实例分享  如何在万网自助建站平台快速创建网站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  PHP 500报错的快速解决方法  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何用西部建站助手快速创建专业网站?  JS中对数组元素进行增删改移的方法总结  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  千库网官网入口推荐 千库网设计创意平台入口  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  怎么用AI帮你为初创公司进行市场定位分析?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel怎么判断请求类型_Laravel Request isMethod用法  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  JavaScript如何实现继承_有哪些常用方法  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何配置Horizon来管理队列?(安装和使用)  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  JavaScript如何实现路由_前端路由原理是什么  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何快速选择适合个人网站的云服务器配置?  如何在IIS管理器中快速创建并配置网站?  Python并发异常传播_错误处理解析【教程】  如何实现javascript表单验证_正则表达式有哪些实用技巧  Linux系统运维自动化项目教程_Ansible批量管理实战  如何在Tomcat中配置并部署网站项目?  韩国服务器如何优化跨境访问实现高效连接?  如何解决hover在ie6中的兼容性问题  网易LOFTER官网链接 老福特网页版登录地址  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载