0

0

什么是并发包中的LongAccumulator_自定义二进制运算规则的原子计数器

P粉602998670

P粉602998670

发布时间:2026-02-16 12:28:01

|

648人浏览过

|

来源于php中文网

原创

绝大多数场景选longadder;仅需非加法运算或非零初始值时才用longaccumulator,它是定制版而非升级版,构造和调用成本更高。

什么是并发包中的longaccumulator_自定义二进制运算规则的原子计数器

LongAccumulator 和 LongAdder 到底该选谁?

绝大多数场景下,LongAdder 更轻量、更高效;只有当你需要非加法运算(比如取最大值、乘法、自定义公式)或非零初始值时,才该用 LongAccumulator。它不是“升级版”,而是“定制版”——功能多,但构造和调用成本略高。

  • LongAdder 固定做加法,初始值只能是 0;LongAccumulator 的初始值由你指定(比如 1Long.MIN_VALUE
  • 构造 LongAccumulator 必须传入一个 LongBinaryOperator,哪怕只是写 (a, b) -> a + b,也比直接 new LongAdder() 多一次函数对象创建
  • 在纯累加且初始为 0 的场景下强行用 LongAccumulator,属于过度设计,还可能因 lambda 捕获带来轻微 GC 压力

怎么写一个安全的 max 计算器?

这是 LongAccumulator 最典型且不可替代的用途:多线程并发更新“当前最大延迟”“最高温度”“峰值 QPS”等指标。关键在于运算规则必须满足**结合律和幂等性**,否则结果不可靠。

今天学点啥
今天学点啥

秘塔AI推出的AI学习助手

下载
  • 正确写法:new LongAccumulator((a, b) -> Math.max(a, b), Long.MIN_VALUE)
  • 错误写法:(a, b) -> a > b ? a : b + 1 —— 破坏幂等性,同一值反复 accumulate 可能持续变大
  • 初始值不能设成 0(比如测响应时间),否则负延迟或未初始化数据会污染结果;Long.MIN_VALUE 是更稳妥的起点
  • 注意:Math.max 是无副作用纯函数,适合并发;别在里面加日志、远程调用或修改外部状态

accumulate() 方法传参容易忽略什么?

accumulate(x) 中的 x 不是“要加的数”,而是“参与二元运算的右操作数”。它的含义完全取决于你传入的 LongBinaryOperator,这点和 LongAdder.add(x) 的直觉不同。

  • 如果你用的是加法:(a,b)->a+b,那 x 就是增量值,和 add(x) 行为一致
  • 如果你用的是乘法:(a,b)->a*b,那 x 就是乘数(比如传 2 表示翻倍),不是“加 2”
  • 如果你用的是位或:(a,b)->a|b,那 x 是掩码值,常用于状态聚合(如多线程收集错误码 bitset)
  • 传错语义会导致结果完全偏离预期,且很难通过单元测试覆盖所有并发路径——务必在文档或变量命名里明确 x 的业务含义

为什么 get() 结果有时“看起来没更新”?

get() 返回的是当前快照值,不阻塞也不同步,它反映的是 base + 所有已分配 Cell 的瞬时和。在高并发写入过程中,部分线程可能刚完成哈希定位但还没写入对应 Cell,此时 get() 就不包含这部分值。

  • 这不是 bug,是设计取舍:牺牲强一致性换取吞吐量,和 LongAdder.sum() 行为一致
  • 如果业务要求强一致(比如财务对账),不要依赖 get(),应改用带锁的普通 longAtomicLong(但会损失性能)
  • 调试时别在循环里高频打日志输出 get(),这会放大“卡顿感”;可改用定期采样或配合 System.nanoTime() 观察趋势
  • 扩容期间(cells 数组增长)也可能导致短暂的值“丢失”,但概率低,且仅限扩容窗口期
事情说清了就结束。真正难的不是写对语法,而是想清楚那个 LongBinaryOperator 在并发语义下是否真的可交换、可重复、无副作用——多数线上问题都栽在这一步。

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

58

2026.01.05

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

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

675

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

346

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

24

2026.01.21

C++多线程相关合集
C++多线程相关合集

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

24

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

96

2026.02.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

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

精品课程

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

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