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

第 4 章 Java 并发包中原子操作类原理剖析

原子变量操作类

  1. AtomicLong 是原子性递增或者递减类,其内部使用 Unsafe 来实现,AtomicLong类也是在 rt.jar 包下面的,AtomicLong 类就是通过 BootStarp 类加载器进行加载的。
  2. 这里的原子操作类都使用 CAS 非阻塞算法
private static final long serialVersionUID = 1927816293512124184L;
 // (1)获取Unsafe实例
 private static final Unsafe unsafe = Unsafe.getUnsafe();
 //(2)存放变量value的偏移量
 private static final long valueOffset;
 
 //(3)判断JVM是否支持Long类型无锁CAS
 static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();
 private static native boolean VMSupportsCS8();
 static {

 try {
 //(4)获取value在AtomicLong中的偏移量
 valueOffset = unsafe.objectFieldOffset
 (AtomicLong.class.getDeclaredField("value"));
 } catch (Exception ex) { throw new Error(ex); }
 }
 //(5)实际变量值
 private volatile long value;
 public AtomicLong(long initialValue) {
 value = initialValue;
 }
 ....
}

LongAdder 简单介绍

  1. AtomicLong 通过 CAS 提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是 JDK 开发组并不满足于此。使用 AtomicLong 时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS 操作会成功,这就造成了大量线程竞争失败后,会通过无限循环不断进行自旋尝试 CAS 的操作,而这会白白浪费 CPU 资源。
  2. 因此 JDK 8 新增了一个原子性递增或者递减类 LongAdder 用来克服在高并发下使用 AtomicLong 的缺点。既然 AtomicLong 的性能瓶颈是由于过多线程同时去竞争一个变量的更新而产生的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源, 是不是就解决了性能问题?是的,LongAdder 就是这个思路。

                                                          CHAPTER-FOUR   OVER.......

                                                            PROCESS--->4/11

                                                   

 


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

相关文章:

  • 【ComfyUI】前景分割ComfyUI-BiRefNet-Hugo (无法选定分割的主体,背景鉴别由模型数据,也叫二分分割,显著性分割)
  • 蓝网科技临床浏览系统存在SQL注入漏洞
  • org.apache.log4j的日志记录级别和基础使用Demo
  • js版本之ES5特性简述【String、Function、JSON、其他】(二)
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-2
  • Qt界面篇:QMessageBox高级用法
  • 鸿蒙NEXT开发案例:文字转拼音
  • Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)
  • 详谈面试题:Vue、React为什么使用虚拟DOM
  • Git中HEAD、工作树和索引的区别
  • MySQL 中的乐观锁与悲观锁
  • 日常开发记录-正确的prop传参,reduce搭配promise的使用
  • 卸载snap docker一直卡住:Save data of snap “docker“ in automatic snapshot set #3
  • [Redis#0] iredis: linux上redis超好用的环境配置
  • [含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的游戏用户行为分析与个性化推荐系统
  • vscode下面python调试报错ImportError: cannot import name ‘Literal‘ from ‘typing‘
  • 【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)
  • Linux 子进程 -- fork函数
  • python之开发笔记
  • 力扣 LRU缓存-146
  • 基于微信小程序的校园二手交易平台设计与实现,微信小程序(定制+讲解+咨询)校园二手商品在线交易系统、校园二手市场管理与推荐工具、智能化商品交易与推荐平台
  • 网络安全、Web安全、渗透测试之笔经面经总结(一)
  • FastAPI学习最后一天: Cors跨域和token鉴权
  • MySQL 存储引擎切换场景与示例
  • 泷羽Sec学习笔记:shell(2)永久环境变量和字符串显位
  • 【Vue】计算属性