当前位置: 首页 > article >正文

JAVA并发编程高级——JDK 新增的原子操作类 LongAdder

LongAdder 简单介绍

        前面讲过,AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong 时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,这就造成了大量线程竞争失败后,会通过无限循环不断进行自旋尝试CAS 的操作,而这会白白浪费 CPU 资源。

        因此JDK8新增了一个原子性递增或者递减类LongAdder用来克服在高并发下使用AtomicLong的缺点。既然 AtomicLong的性能瓶颈是由于过多线程同时去竞争一个变量的更新而产生的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源,是不是就解决了性能问题?是的,LongAdder 就是这个思路。下面通过图来理解两者设计的不同之处,如图 4-1 所示。

如图 4-1所示,使用 AtomicLong时,是多个线程同时竞争同一个原子变量。

        如图 4-2所示,使用LongAdder时,则是在内部维护多个Cell变量,每个Cell 里面有一个初始值为0的long型变量,这样,在同等并发量的情况下,争夺单个变量更新操作的线程量会减少,这变相地减少了争夺共享资源


http://www.kler.cn/a/325580.html

相关文章:

  • 森林网络部署,工业4G路由器实现林区组网远程监控
  • SpringMVC——原理简介
  • 【AI日记】25.01.15
  • 【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构
  • 【Vim Masterclass 笔记14】S07L29 + L30:练习课08 —— Vim 文本对象同步练习(含点评课内容)
  • 计算机网络的五层协议
  • 渗透测试实战—教育攻防演练信息收集
  • Bugku 渗透测试1
  • 03. 前端面试题之ts : typescript 的数据类型有哪些?
  • LeetCode 热题 100 回顾2
  • 3种方法解决Docker容器中配置运行环境问题
  • 使用Python实现图形学的法线映射算法
  • 磁盘管理器
  • Qt网络编程——QUdpSocket
  • golang学习笔记24-文件操作
  • 实用好软-----电脑端 从视频中导出音频的方便工具
  • 微信小程序-数据模型与动态赋值
  • 女性向游戏的新战场:AI陪伴系统
  • CSS中的字体样式、文本样式、列表样式以及背景和渐变
  • VS Code、Git与自动化脚本的效能之旅
  • MATLAB GUI设计原则与实践
  • GPT带我学-设计模式18-访问者模式
  • Springboot项目-实战2-实现
  • 计数排序(counting sort)
  • 计算机毕业设计 饮食营养管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 问题:vscode 打印中文时终端输出乱码