源码系列-LongAdder和AtomicLong对比

简介: 源码系列-LongAdder和AtomicLong对比

相当于一个AtomicLong数组,初始化时,初始化大小为2的数组,并初始化相对应位置的一个元素Cell,当每次去尝试获取时,根据当前线程获得的随机值threadLocalRandom取模(大小为cell的数组容量)获得索引值,然后会去找相应位置的元素,找不到则插入新的cell, 然后进行CAS操作(比如compareAndSwapLong),与AtomicLong原理相同,操作成功则结束,操作失败,会尝试扩容为原先cell数组大小的两倍,然后重新初始化要更新的索引值(threadLocalRandom value|array size),再进行CAS操作.

再尝试扩容的过程中,如果大小已经达到CPU核数,则不会再扩容,再次尝试操作。

这样做的好处是,在低并发下,性能表现和原子类型相似(一个是CAS 操作,一个是独占缓存行的cell ,值为 volatile long value),高并发下,能把压力分摊到各个cell,并且sum结果能保证最终一致性。

 

Cell 用到了缓存行独享的注解:

在JDK 8 提供了一种消除伪内存共享的方式:

  1. 在code中添加sun.misc.Contended注解;
  2. 将JVM参数配添加上-XX:-RestrictContended;

 

个人认为在QPS统计等统计操作上,LongAdder会更加适合,而AtomicLong在自增控制方面是LongAdder无法代替的。

目录
相关文章
|
6月前
|
缓存 安全 算法
Java并发基础:原子类之AtomicInteger全面解析
【2月更文挑战第2天】AtomicInteger类提供了线程安全的整数操作,它通过利用底层硬件的原子性指令,能够在多线程环境中高效地实现整数的无锁更新,避免了传统同步机制带来的性能开销,在高并发场景下成为计数器可大幅提高程序的执行效率,同时又保证了数据一致性。
220 16
Java并发基础:原子类之AtomicInteger全面解析
|
6月前
|
设计模式 算法 安全
阿里推荐 LongAdder ,不推荐 AtomicLong !
在分布式系统中,计数器是一个常见的需求。为了实现高并发、高可用的计数器,我们需要选择一个合适的实现方式。在 Java 中,有两种常见的计数器实现方式:AtomicLong 和 LongAdder。最近,阿里巴巴在一份技术报告中推荐使用 LongAdder ,而不是 AtomicLong。本文将介绍这两种计数器的原理和优缺点,并分析为什么阿里巴巴推荐使用 LongAdder。
114 3
|
存储 缓存 算法
LongAdder的源码学习与理解
LongAdder 有了AtomicLong为什么还要LongAdder LongAdder中的主要方法
127 3
LongAdder的源码学习与理解
|
安全 算法 Java
详解java并发原子类AtomicInteger(基于jdk1.8源码分析)
java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。
331 0
详解java并发原子类AtomicInteger(基于jdk1.8源码分析)
|
安全 Oracle Java
阿里为什么推荐使用LongAdder,而不是volatile?
阿里为什么推荐使用LongAdder,而不是volatile?
151 0
阿里为什么推荐使用LongAdder,而不是volatile?
|
Java 对象存储
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(中)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(中)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(中)
|
算法 安全 Java
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(上)
|
存储 算法 Java
【小家java】AtomicLong可以抛弃了,请使用LongAdder代替(或使用LongAccumulator)(上)
【小家java】AtomicLong可以抛弃了,请使用LongAdder代替(或使用LongAccumulator)(上)
【小家java】AtomicLong可以抛弃了,请使用LongAdder代替(或使用LongAccumulator)(上)
|
存储 Java 测试技术
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(下)
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了(下)
|
Java 测试技术 API
【小家java】AtomicLong可以抛弃了,请使用LongAdder代替(或使用LongAccumulator)(下)
【小家java】AtomicLong可以抛弃了,请使用LongAdder代替(或使用LongAccumulator)(下)