JDK8中新增的原子性操作类LongAdder详解

发布时间 - 2026-01-11 02:56:34    点击率:

前言

本文主要给大家介绍了关于JDK8新增的原子性操作类LongAdder的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

LongAdder简单介绍

LongAdder类似于AtomicLong是原子性递增或者递减类,AtomicLong已经通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足,因为在非常高的并发请求下AtomicLong的性能不能让他们接受,虽然AtomicLong使用CAS但是CAS失败后还是通过无限循环的自旋锁不断尝试的

 public final long incrementAndGet() {
  for (;;) {
   long current = get();
   long next = current + 1;
   if (compareAndSet(current, next))
    return next;
  }
 }

在高并发下N多线程同时去操作一个变量会造成大量线程CAS失败然后处于自旋状态,这大大浪费了cpu资源,降低了并发性。那么既然AtomicLong性能由于过多线程同时去竞争一个变量的更新而降低的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源那么性能问题不就解决了?是的,JDK8提供的LongAdder就是这个思路。下面通过图形来标示两者不同。


如图AtomicLong是多个线程同时竞争同一个变量。


如图LongAdder则是内部维护多个变量,每个变量初始化都0,在同等并发量的情况下,争夺单个变量的线程量会减少这是变相的减少了争夺共享资源的并发量,另外多个线程在争夺同一个原子变量时候如果失败并不是自旋CAS重试,而是尝试获取其他原子变量的锁,最后获取当前值时候是把所有变量的值累加后返回的。

LongAdder维护了一个延迟初始化的原子性更新数组和一个基值变量base.数组的大小保持是2的N次方大小,数组表的下标使用每个线程的hashcode值的掩码表示,数组里面的变量实体是Cell类型,Cell类型是AtomicLong的一个改进,用来减少缓存的争用,对于大多数原子操作字节填充是浪费的,因为原子性操作都是无规律的分散在内存中进行的,多个原子性操作彼此之间是没有接触的,但是原子性数组元素彼此相邻存放将能经常共享缓存行,所以这在性能上是一个提升。

另外由于Cells占用内存是相对比较大的,所以一开始并不创建,而是在需要时候在创建,也就是惰性加载,当一开始没有空间时候,所有的更新都是操作base变量,

自旋锁cellsBusy用来初始化和扩容数组表使用,这里没有必要用阻塞锁,当一次线程发现当前下标的元素获取锁失败后,会尝试获取其他下表的元素的锁。更详细的说明敬请期待 Java并发编程基础之并发包源码剖析 一书的出版

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# jdk8新特性  # jdk8  # 内部类  # jdk1.8新增特性  # java高并发下解决AtomicLong性能瓶颈方案LongAdder  # 分析并发编程之LongAdder原理  # 一篇带你解析入门LongAdder源码  # Java并发工具类LongAdder原理实例解析  # LongAdder原理及创建使用示例详解  # 多个  # 都是  # 如图  # 是一个  # 这是  # 是在  # 很好  # 相关内容  # 说了  # 则是  # 不多  # 给大家  # 不就  # 要用  # 这篇文章  # 这在  # 比较大  # 谢谢大家  # 类似于  # 一书 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: WEB开发之注册页面验证码倒计时代码的实现  jQuery validate插件功能与用法详解  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  浅谈redis在项目中的应用  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  javascript如何操作浏览器历史记录_怎样实现无刷新导航  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  js实现点击每个li节点,都弹出其文本值及修改  如何基于云服务器快速搭建网站及云盘系统?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  魔方云NAT建站如何实现端口转发?  PHP 500报错的快速解决方法  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  魔毅自助建站系统:模板定制与SEO优化一键生成指南  高防服务器租用如何选择配置与防御等级?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在腾讯云服务器快速搭建个人网站?  如何在服务器上三步完成建站并提升流量?  如何在IIS中新建站点并解决端口绑定冲突?  如何在Windows服务器上快速搭建网站?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  教你用AI润色文章,让你的文字表达更专业  EditPlus中的正则表达式 实战(1)  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  个人摄影网站制作流程,摄影爱好者都去什么网站?  javascript中对象的定义、使用以及对象和原型链操作小结  JavaScript模板引擎Template.js使用详解  如何在建站宝盒中设置产品搜索功能?  专业商城网站制作公司有哪些,pi商城官网是哪个?  Android Socket接口实现即时通讯实例代码  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  浅述节点的创建及常见功能的实现  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  MySQL查询结果复制到新表的方法(更新、插入)  实现点击下箭头变上箭头来回切换的两种方法【推荐】  米侠浏览器网页背景异常怎么办 米侠显示修复