0

0

什么是Java中的LongAdder_Java 8新引入的高并发计数器分段累加原理

P粉602998670

P粉602998670

发布时间:2026-03-15 09:27:38

|

176人浏览过

|

来源于php中文网

原创

LongAdder比AtomicLong更快在于用空间换时间,将热点变量拆分为多个Cell以减少缓存行争用;适用于写多读少场景,但sum()非原子快照、不支持重置、非强一致。

什么是java中的longadder_java 8新引入的高并发计数器分段累加原理

LongAdder 为什么比 AtomicLong 更快

核心在于它用空间换时间,把单个热点变量拆成多个 Cell,写操作尽量分散到不同缓存行,避免多核 CPU 频繁争抢同一块缓存(False Sharing)。AtomicLong 的 incrementAndGet() 在高并发下会反复 CAS 失败重试,而 LongAdder 把累加压力分摊了。

实操建议:

  • 只在「写多读少」场景用 LongAdder,比如统计请求量、错误数;如果需要强一致的实时值(如限流阈值判断),还是得回退到 AtomicLong
  • sum() 不是原子快照——它遍历所有 Cell 并加总,期间其他线程可能还在写,结果只是近似值
  • 初始化后不支持 reset,要清零只能新建实例;别试图用 sumThenReset() 做周期统计,它不保证线程安全地“先读再清”

LongAdder 的 add() 和 increment() 有啥区别

没本质区别。increment() 就是 add(1L) 的语法糖。真正影响行为的是底层策略:首次调用时尝试直接 CAS 更新 base 字段;失败后才初始化 cells 数组并哈希分配线程专属 Cell

常见错误现象:

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

Giiso写作机器人
Giiso写作机器人

Giiso写作机器人,让写作更简单

下载
  • 压测初期吞吐上不去——因为 cells 还没扩容,所有线程挤在 base 上竞争,表现接近 AtomicLong
  • 某些线程长期只更新自己的 Cell,导致 sum() 值偏低(尤其短时低并发测试)
  • 误以为 add(-1) 是“减法”,其实它就是带符号加法,语义完全正确,但要注意业务逻辑是否允许负值累积

LongAdder 在 JDK 8+ 中的兼容性陷阱

它从 JDK 8 引入,JDK 7 及更早版本根本不存在这个类。如果你的项目需兼容老版本,不能简单替换 import,得做运行时判断或抽象封装。

性能与兼容性权衡:

  • JDK 9+ 中 Striped64(LongAdder 父类)做了 cache line padding 优化,减少 False Sharing;JDK 8 的实现 padding 不够彻底,极端场景下仍有性能落差
  • Android 环境(尤其旧版 ART)不包含 sun.misc.Unsafe 的完整支持,LongAdder 可能抛 NoClassDefFoundError 或静默降级失效
  • 不要在 finalize() 或 shutdown hook 里调用 sum()——cells 数组可能已被 GC 回收,返回值不可靠

什么时候不该用 LongAdder

它不是万能替代品。一旦需求涉及精确、即时、可预测的数值语义,就得警惕。

  • 分布式 ID 生成器?不行——add() 不保证全局单调递增,不同 Cell 的更新无序
  • 作为 while 循环的退出条件?危险——sum() < 1000 可能永远为真,因为其他线程刚写完还没被 sum 捕获
  • 监控埋点中直接打印 sum() 日志?注意日志输出本身可能阻塞,而 sum() 遍历 cells 是 O(n) 操作,n 是活跃线程数,高峰时可能拖慢整个日志线程
  • volatile long 混用?别碰——LongAdder 内部不依赖 volatile 语义,混用会导致可见性错乱,读不到最新值

最常被忽略的一点:它的内存开销是动态增长的。每个活跃线程最多持有一个 Cell,而每个 Cell 至少占 64 字节(含 padding),线程数飙到几百时,光 cells 就吃掉几十 KB——这在内存敏感的嵌入式或函数计算场景里,比锁竞争更致命。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

412

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.07

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

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

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

76

2025.10.23

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

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

766

2023.08.10

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

176

2023.12.07

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

341

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1821

2023.08.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.4万人学习

Java 教程
Java 教程

共578课时 | 82.7万人学习

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

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