阿里推荐 LongAdder ,不推荐 AtomicLong !

news2024/11/25 2:38:51

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、CAS

1.1 CAS 全称

1.2 通俗理解CAS

1.3 CAS的问题

1.4 解决 ABA 问题

二、LongAdder

2.1 什么是 LongAdder

2.2 为什么推荐推荐 LongAdder

三、AtomicLong

3.1 什么是 AtomicLong 

3.2 为什么不推荐 AtomicLong

四、总结


前言

在分布式系统中,计数器是一个常见的需求。为了实现高并发、高可用的计数器,我们需要选择一个合适的实现方式。

在 Java 中,有两种常见的计数器实现方式:AtomicLong 和 LongAdder。

最近,阿里巴巴在一份技术报告中推荐使用 LongAdder ,而不是 AtomicLong 。

本文将介绍这两种计数器的原理和优缺点,并分析为什么阿里巴巴推荐使用 LongAdder 。


一、CAS

1.1 CAS 全称

全称:compare and swap,比较并交换。
虽然翻译过来是[比较并交换],但它是一个原子性的操作,对应到CPU指令为 cmpxchg 。

1.2 通俗理解CAS

  1. CAS 有三个操作数:当前值A、内存值V、要修改的新值B。
  2. 假设 当前值A 跟 内存值V 相等,那就将内存值V 改成B。
  3. 假设 当前值A 跟 内存值V 不相等,要么就重试,要么就放弃更新。
  4. 将当前值与内存值进行对比,判断是否有被修改过,这就是CAS的核心。

1.3 CAS的问题

CAS有个缺点就是会带来 ABA 的问题。
从CAS更新的时候,我们可以发现它只比对当前值和内存值是否相等,这会带来个问题,下面我举例说明下:

  1. 假设线程A读到当前值是10,可能线程B把值修改为100,然后线程C又把值修改为10。
  2. 等到线程A拿到执行权时,因为当前值和内存值是一致的,线程A是可以修改的!
  3. 站在线程A的角度来说,这个值是从未被修改的 。
  4. 这是不合理的,因为我们从上帝的角度来看,这个变量已经被线程B和线程C修改过了。

1.4 解决 ABA 问题

要解决ABA的问题,Java 也提供了 AtomicStampedReference 类供我们用,说白了就是加了个版本,比对的就是内存值+版本是否一致。

疑问:

为什么阿里巴巴开发手册提及到推荐使用 LongAdder 对象,比AtomicLong 性能更好(减少乐观锁的重试次数)?

原因:

因为 AtomicLong 做累加的时候实际上就是多个线程操作同一个目标资源。

在高并发时,只有一个线程是执行成功的,其他的线程都会失败,不断自旋(重试),自旋会成为瓶颈。

而 LongAdder 的思想就是把要操作的目标资源 分散,到数组 Cell 中。

每个线程对自己的 Cell 变量的 value 进行原子操作,大大降低了失败的次数。

这就是为什么在高并发场景下,推荐使用 LongAdder  的原因。


二、LongAdder

2.1 什么是 LongAdder

LongAdder是JDK1.8由Doug Lea大神新增的原子操作类,位于java.util.concurrent.atomic包下,LongAdder在高并发的场景下会比AtomicLong 具有更好的性能,代价是消耗更多的内存空间

LongAdder是Google开源的一个高性能计数器实现。它采用了一种分段锁的策略,将一个long型的变量分割成多个16字节的段,每个段都使用一个独立的AtomicLong进行更新。这样,在高并发场景下,多个线程可以同时对不同的段进行更新操作,互不干扰。

LongAdder的优点是并发性能高,适用于高并发的场景。由于采用了分段锁的策略,LongAdder可以避免AtomicLong中的竞争问题。此外,LongAdder还支持可扩展性,可以通过增加更多的段来提高性能。但是,LongAdder的缺点是代码相对复杂一些,需要更多的维护成本。

2.2 为什么推荐推荐 LongAdder

LongAdder设计思想上,采用分段的方式降低并发冲突的概率。通过维护一个基准值base和 Cell 数组

如下图所示:


三、AtomicLong

3.1 什么是 AtomicLong 

AtomicLong是Java提供的一个原子类,用于实现高并发的计数器。它利用了CAS(Compare-and-Swap)操作来保证线程安全。在AtomicLong中,每次计数操作都会先读取当前值,然后使用CAS操作更新值。如果值没有被其他线程修改过,则更新成功,否则需要重新尝试。

AtomicLong的优点是简单易用,性能也不错。但是,在高并发场景下,AtomicLong可能会出现竞争问题。因为多个线程可能同时读取和更新同一个AtomicLong的当前值,导致数据不一致。此外,AtomicLong的CAS操作也可能因为硬件和操作系统的原因出现失败的情况。

3.2 为什么不推荐 AtomicLong

在LongAdder之前,当我们在进行计数统计的时,通常会使用AtomicLong来实现。AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。

如下图所示:

图里可以看出在高并发情况下,当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。


四、总结

阿里巴巴推荐使用LongAdder的原因主要有以下几点:

  1. 高并发性能:LongAdder采用分段锁的策略,可以避免AtomicLong中的竞争问题,提高并发性能。在分布式系统中,高并发性能是非常重要的。
  2. 可扩展性:LongAdder支持可扩展性,可以通过增加更多的段来提高性能。这对于需要处理大量请求的分布式系统来说是非常有利的。
  3. 代码简单易懂:虽然LongAdder的代码相对复杂一些,但是相对于AtomicLong来说更容易理解和维护。这对于开发人员来说是非常重要的。
  4. 更好的适用场景:阿里巴巴推荐使用LongAdder主要是因为在分布式系统中需要一个高性能、高可用的计数器实现。而LongAdder正好符合这个需求。

总之,阿里巴巴推荐使用LongAdder的原因主要是因为它的高并发性能、可扩展性、代码简单易懂以及更好的适用场景。当然,在实际应用中还需要根据具体场景和需求进行选择和优化。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导蓝牙耳机什么品牌音质好,最全盘点骨传导耳机品牌前五汇总

秋天到了,天气不那么热了,运动的感觉又回来了!这时候,配上耳机里舒缓的音乐,简直是一种享受。说到运动耳机,大家知道吗?骨传导耳机可是运动的最佳拍档哦。它跟普通蓝牙耳机不一样,不…

【git学习笔记 01】打标签

文章目录 一、声明二、对标签的基本认知什么是标签?为什么要打标签?如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏,望批评指正!参考视频链接,非常感谢原作者&…

外贸SEO建站系统有哪些?海洋建站的优势?

外贸SEO建站怎么做比较好?如何做谷歌独立站SEO优化? 外贸企业越来越需要建立自己的在线形象,以吸引更多的潜在客户。而要实现这一目标,外贸SEO建站系统是一种非常有效的手段。那么,外贸SEO建站系统有哪些呢&#xff1…

BSWM 模式管理(一) 基本规则

BSWM 模式管理 基本规则 1 BSWM 模式管理2 AUTOSAR BSWM 的两种 operation 模式2.1 deferred opration2.2 immediate opration1 BSWM 模式管理 BSW 模式管理由 4 部分组成: Mode source: 模式仲裁的的触发器,可以由 APP/BSW 模块请求触发Mode Arbitration:当模式源出发的时候…

【已解决】修改了网站的class样式name值,会影响SEO,搜索引擎抓取网站及排名吗?

问题: 修改了网站的class样式name值,会影响搜索引擎抓取网站及排名吗? 解答: 如果你仅仅修改了网站class样式的名称,而没有改变网站的结构和内容,那么搜索引擎通常不会因此而影响它对网站的抓取和排名。但…

洗沙废水怎么处理

洗沙废水是指在沙石开采或洗刷过程中产生的含有大量悬浮物、沉淀物、重金属等污染物的废水。由于洗沙废水具有高浊度、高浓度和复杂成分的特点,直接排放会对水环境造成严重污染。因此,科学有效地处理洗沙废水至关重要。在处理洗沙废水时,我们…

常见可视化大屏编辑器有哪些?

前言: 在当今数字化时代,可视化大屏编辑器成为了数据展示和决策支持的重要工具。大屏编辑器不仅仅是数据的呈现,更是数据背后的故事的讲述者。它通过图表、图形和实时数据的呈现,为用户提供了全面的信息视图,帮助用户更…

远程多窗口和Screen用法

Termius 远程链接服务器终端时,经常遇到需要开多个窗口,另外还可能涉及到正在运行的程序一旦和服务器链接断开,那么程序也就停止执行了。对于单单只需要多个窗口的问题,建议下载一个Termius这样软件,比多次打开…

Asp.Net Core 项目中常见中间件调用顺序

常用的 AspNetCore 项目中间件有这些,调用顺序如下图所示: 最后的 Endpoint 就是最终生成响应的中间件。 Configure调用如下: public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseD…

全球知名的五款JavaScript混淆加密工具详解

​ 现在市场上有很多好用的混淆加密工具,其中一些比较流行且受欢迎的工具包括: 1、UglifyJS(罗马尼亚):UglifyJS是一个非常流行的 JavaScript工具库,它可以压缩、混淆、美化和格式化 JavaScript 代码。使用…

【LeetCode】2695. 包装数组

包装数组 题目题解 题目 创建一个名为 ArrayWrapper 的类,它在其构造函数中接受一个整数数组作为参数。该类应具有以下两个特性: 当使用 运算符将两个该类的实例相加时,结果值为两个数组中所有元素的总和当在实例上调用 String() 函数时&a…

光伏汇流箱浪涌保护器应用方案

光伏发电系统是一种利用太阳能产生直流电的清洁能源,但由于其分布式和开放式的特点,很容易受到雷电和其他电源干扰引起的电涌的影响,导致设备损坏或系统故障。因此,为了保护光伏系统的安全和稳定运行,需要在光伏系统的…

如何制作一本电子产品图册,打开线上推广呢

​随着互联网的普及和社交媒体的兴起,越来越多的企业开始注重线上传播。对于产品而言,制作一本精美的产品图册不仅可以展示产品的外观和特点,还可以通过线上传播吸引更多的潜在客户。 不会制作的朋友们,其实也不用担心&#xff0c…

Redis分布式缓存-Redis持久化

RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文…

期货开平规则(期货交易开平规则解析)

什么是期货开平规则 期货开平规则,简单来说是指期货交易中的开仓和平仓所遵循的一系列规定。具体而言,开仓是指买入或卖出期货合约,建立一个新的持仓;平仓则是指买入或卖出相应数量的期货合约,用以解除原有持仓。开平…

Mysql之约束上篇

Mysql之约束上篇 约束的概述为什么需要约束什么是约束约束的分类 非空约束作用关键字特点添加非空约束删除非空约束 唯一性约束关键字特点添加唯一约束关于复合唯一约束删除唯一约束查看索引 主键约束(非空唯一性约束)作用关键字特点添加主键约束关于复合主键删除主键约束 约束…

使用pytest+selenium+allure实现web页面自动化测试

测试文件 base 基本方法data 测试数据page web页面相关操作image 测试截图log 日志文件report 测试报告文件temp 临时文件tool 文件读取,发邮件文件TestCases 测试用例 在page下的__init__.py文件下配置 import os import time from selenium.webdriver.common.by…

【小沐学Unity3d】3ds Max 减面工具:Simplyon(Unity3d,Python)

文章目录 1、简介2、下载安装2.1 安装Simlygon插件2.2 安装USD插件 3、使用测试4、Python测试结语 1、简介 Simplygon 带有一个 Unity 插件,它公开了优化功能,例如缩减、聚合、重新划分网格、冒名顶替者(SingleView、BillboardCloud / Veget…

PDF控件Spire.PDF for .NET【安全】演示:将加密或解密 PDF 文件

当涉及到在 Internet 上共享机密文档时,PDF 加密是一项至关重要的任务。通过使用强密码加密 PDF 文件,您可以保护文件数据免遭未经授权的人员访问。在某些情况下,可能还需要删除密码才能公开文档。在本文中,您将了解如何使用Spire…

spring-validation实现分组校验

文章目录 前言实际开发可能会使用到分组校验maven添加依赖简单使用高级应用分组自定义分组组合分组 源码地址 前言 JSR 303中提出了Bean Validation,表示JavaBean的校验,Hibernate Validation是其具体实现,并对其进行了一些扩展,…