0

0

详解LongAdder的分段计数单元Cell_避免高度竞争下的总线风暴

P粉602998670

P粉602998670

发布时间:2026-03-10 10:19:02

|

417人浏览过

|

来源于php中文网

原创

longadder不用volatile long累加是因cas争抢同一地址引发总线风暴;它采用分段cell数组,线程分散写入不同cell,仅求和时串行读取,降低竞争;cell通过@contended防伪共享,扩容时用cellsbusy锁并支持协助迁移。

详解longadder的分段计数单元cell_避免高度竞争下的总线风暴

LongAdder 为什么不用 volatile long 做累加?

因为 volatile longgetAndAdd 底层依赖 CAS,高并发下大量线程反复争抢同一个内存地址,会触发总线锁或缓存一致性协议(如 MESI)频繁广播,导致“总线风暴”——CPU 花在同步上的开销远超计算本身。

LongAdder 换了思路:不争一个地址,而是分多个 Cell,让线程尽量往不同 Cell 上写。只有最终求和时才串行读一遍所有 Cell,把竞争从“每次累加”降为“偶尔求和”。

  • Cell 是个内部静态类,每个实例持有一个 volatile long value,但彼此内存地址错开(通过 @sun.misc.Contended 防伪共享)
  • 初始无 Cell,第一次 add 会先尝试 CAS 更新 base 字段;失败才初始化 cells 数组
  • cells 数组长度总是 2 的幂,用 hash & (length - 1) 定位槽位,避免取模开销

Cell[] 数组扩容时机与风险

扩容不是按需即时进行的,而是在线程发现冲突(CAS 失败)且当前数组非空、未在扩容中时,才尝试 cellsBusy 自旋锁 + CAS 双重检查后扩容。

关键点在于:扩容期间新来的 add 操作可能直接退回到 base 累加,也可能帮着迁移旧 Cell —— 这是 LongAdder “尽力而为”设计的一部分,不保证强一致性,但保障无锁与高吞吐。

  • 扩容倍增(length ),最大到 CPU 核心数上限(<code>NCPU),避免过度分配
  • cellsBusy == 1,说明正被其他线程持有扩容锁,当前线程不会阻塞,而是转去更新 base
  • 扩容失败(如 CAS cellsBusy 失败多次)会放弃,下次再试;不会抛异常,也不会死等

get() 和 sum() 的区别在哪?

get() 就是 sum(),两者完全等价。LongAdder 没有单独维护一个“当前值”字段,所有读操作都必须遍历 cells 数组并加上 base

NNiji·Journey
NNiji·Journey

二次元风格绘画生成器,由 Spellbrush 与 Midjourney 共同设计开发

下载

这意味着:即使没写入,get() 也不是 O(1);它的时间取决于 cells.length,最坏是 O(N),N 是 cells 数组长度(通常 ≤ CPU 核数)。

  • 没有缓存值,所以 get() 总是反映“尽力聚合后的近似最新”,但不承诺实时性
  • 如果业务需要严格单调递增或精确瞬时值(比如限流阈值判断),LongAdder 不适合,得换 AtomicLong
  • 注意:sum() 不加锁,但遍历时若其他线程正在扩容或新建 Cell,可能漏掉刚创建还没赋值的槽位(value=0),属于设计允许的误差

什么时候该避开 LongAdder 的 Cell 分段机制?

当你的场景里“读远多于写”,或者“写操作本身极轻量但要求低延迟响应”,LongAdder 反而更重——每次 get() 都要循环读数组,而 AtomicLong.get() 是单次 volatile 读。

另外,如果线程数远少于 CPU 核数(比如只有 2–3 个 worker 线程),分段收益几乎为零,还多了 hash 计算、数组查找、空指针判断等分支逻辑。

  • 单元测试中模拟高并发写?别用 LongAdder —— 测试难以断言中间态,AtomicLong 行为确定、易验证
  • 日志计数器、监控指标这类“最终一致即可”的场景,才是 Cell 分段真正发挥价值的地方
  • 注意 JVM 参数:-XX:-RestrictContended 在 JDK 8u20+ 后默认开启,否则 @Contended 注解无效,Cell 仍可能伪共享

实际用的时候,最容易忽略的是:LongAdder 的“快”,只在写竞争激烈 + 读不频繁 + 线程数足够多时成立。拿它当普通计数器用,反而可能更慢,也更难 debug。

相关标签:

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

75

2025.10.23

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

953

2023.09.19

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

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

764

2023.08.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

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

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

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

116

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

180

2026.03.03

热门下载

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

精品课程

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

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