LongAdder功能和原理

2023-11-21 04:45
文章标签 功能 原理 longadder

本文主要是介绍LongAdder功能和原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。
AtomicLong的缺点:
可以看到在高并发情况下,当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。

LongAdder在【高并发】的场景下会比AtomicLong具有更好的性能,代价是消耗更多的内存空间。

工作原理

1LongAdder设计思想上,采用分段的方式降低并发冲突的概率。通过维护一个基准值【base】和【Cell数组】2、当没有出现多线程竞争的情况,线程会直接对base里面的value进行修改,这个操作其实和AtomicLong操作是一样的。
3、当多线程的时候,那么LongAdder会初始化一个cell数组,然后对每个线程获取对应的hash值,之后通过hash & (size -1)[size为cell数组的长度]
将每个线程定位到对应的cell单元格,之后这个线程将值写入对应的cell单元格中的value,之后将所有【cell单元格的value】和【base中的value】进行累加求和得到最终的值。并且每个线程竞争的Cell的下标不是固定的,如果CAS失败,会重新获取新的下标去更新,从而极大地减少了CAS失败的概率。缺点:只能用做计数器,如果要获取总数,他是通过累加多个数组的值进行相加的,所以不是原子性的操作,实时获取值不一定准确。

在这里插入图片描述
当需要拿到总数时 =base+cell[0]+cell[1]+cell[2]+cell[3]+…

LongAdder和AtomicLong性能对比

下面是记录1个线程,分别通过LongAdderAtomicLong计算从0累加到100000000,耗时对比。treadCount表示线程数:线程一次从1增加到80个。结论:
11个线程时速度是最快的。并且AtomicLongLongAdder还要快。
2、多个线程执行的情况下,单个线程执行的效率是最高的。
3、多个线程执行的情况下,LongAdder要快很多。
所以这也是在高并发下syn....性能很高的原因。因为AtomicLong里面还有很多无用的for自选操作。

在这里插入图片描述

源码

在这里插入图片描述

在这里插入图片描述

拓展

高并发的场景下,通过这种思想,还可以把同一个商品库存拆分多条数据,一条数据拆成多条数据,就变成了1个行锁,变成了多个行锁。
比如下面这种一张表里面同一个商品Id,通过多行数据记录库存,总库存等于各行库存之后,当请求进来,通过路由策略,选择扣减指定行的库存,
这样就极大的增加了并发能力,而且就算路由到某行数据因为库存为0,但是总库存不为0,这样也没关系,因为高并发下,速度是很快的,所以也可以忽略。
当然也可以通过一些方式让库存为0的行,不参与并发的扣减

在这里插入图片描述

原文链接:跳转

这篇关于LongAdder功能和原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399896

相关文章

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要