0

0

Java中的DoubleAdder与LongAdder_高并发计数场景下的类库性能优化

P粉602998670

P粉602998670

发布时间:2026-03-17 14:05:34

|

181人浏览过

|

来源于php中文网

原创

LongAdder 和 DoubleAdder 比 AtomicLong 快,因其采用分段累加+最终合并机制,减少CAS自旋;但仅适用于写多读少场景,sum()非原子快照且不清理空闲cell,API更窄,不支持compareAndSet等操作。

java中的doubleadder与longadder_高并发计数场景下的类库性能优化

DoubleAdder 和 LongAdder 为什么比 AtomicLong 快

因为它们用「分段累加 + 最终合并」代替了全局 CAS 自旋。AtomicLong 在高并发下大量线程争抢同一个值,失败重试成本高;而 DoubleAdderLongAdder 内部维护一个 cell 数组,线程先尝试往自己的 slot 累加,冲突少、自旋少。

但这个优势只在「写多读少」场景明显——比如统计请求量、埋点计数、实时聚合指标。如果频繁调用 sum(),反而可能因遍历 cell 数组带来开销。

  • sum() 不是原子快照:执行过程中其他线程仍可修改,结果是近似实时值,不是严格某一时刻的精确和
  • 初始状态为 0,但 sum() 返回前不会自动压缩或清理空闲 cell,长期运行后 cell 数组可能膨胀(尤其在突发流量后又归于平静)
  • 不支持 compareAndSet、getAndIncrement 等原子操作,API 比 AtomicLong 更窄,仅适合“只加不查”的计数器角色

什么时候该用 LongAdder 而不是 DoubleAdder

看你要累加的是整数还是浮点数——别被名字误导:LongAdder 是 long 类型,DoubleAdder 是 double 类型,二者底层实现不同,不能混用。

DoubleAdder 内部用 long 存储 double 的 bit 表示(类似 Double.doubleToRawLongBits),再通过 CAS 操作 long 字段模拟浮点累加,所以它比 LongAdder 多一层转换开销,且存在浮点精度丢失风险(比如连续加 0.1 加十次,结果可能不是 1.0)。

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

  • 计数器、QPS、UV/PV 统计 → 无条件选 LongAdder
  • 需要累加带小数的度量值(如平均响应时间毫秒值、百分比)→ 先确认是否真需要 float/double 精度;多数监控场景其实可以转成 nanos 或万分之一单位用 LongAdder 避免误差
  • 必须用 double 且能接受误差 → 才考虑 DoubleAdder,但要留意 sum() 返回的是 double,不是原始累加过程的数学精确值

sum() 和 sumThenReset() 的行为差异与线程安全边界

sum() 是只读操作,线程安全,但不阻塞写入;sumThenReset() 是“读+清零”原子操作,内部会把所有 cell 值归零,并返回归零前的总和。

ProcessOn
ProcessOn

免费在线流程图思维导图,专业强大的作图工具,支持多人实时在线协作

下载

注意:sumThenReset() 并非完全原子——它无法阻止其他线程在你读完 cell[i] 后、清零前再次向该 cell 写入。所以它的“清零”是对当前已知 cell 的批量归零,新来的写入会落在新分配或已有非空 cell 上。

  • 做周期性上报(如每 10 秒 push 一次当前累计值并清零)→ 用 sumThenReset(),但需接受两次上报之间可能漏掉极少量新增值(概率低,但存在)
  • 只是临时查看当前估算值(如健康检查暴露指标)→ 用 sum(),更轻量
  • 不要在循环里反复调用 sumThenReset() 并期望得到互斥的区间值——并发写入可能导致某次 reset 后立刻又被写入,下次 sum 时包含“本该属于上一周期”的数据

常见误用:当成 AtomicLong 的直接替代品

很多人看到“高性能”就直接把代码里的 AtomicLong 替成 LongAdder,结果发现单元测试失败或者逻辑异常——根本原因是语义变了。

AtomicLong.get() 返回精确当前值;LongAdder.sum() 返回估算值;AtomicLong.incrementAndGet() 返回自增后的精确值;LongAdder.increment() 没有返回值。

  • 如果你的业务依赖「每次自增都拿到最新值并做判断」(比如限流器判断是否超阈值),就不能用 LongAdder,必须保留 AtomicLong 或改用 Striped64 子类外的方案
  • 初始化后未调用任何 add()increment()sum() 返回 0,看起来没问题,但掩盖了“是否真被写入过”的事实——调试时容易误判数据通路
  • Spring Bean 中注入单例 LongAdder 用于跨请求计数?可以,但要注意它没有内置 reset 机制,长期运行后 sum() 可能越来越大,监控告警阈值得按趋势设计,不能写死

最常被忽略的一点:这两个类都不是为「强一致性读写」设计的。它们的快,本质是用一致性换性能。用之前先想清楚——你到底要的是“快”,还是“看起来快但其实不准”。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

161

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

89

2026.01.26

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

597

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

597

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

355

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

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

精品课程

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

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.7万人学习

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

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