LongAdder与LongAccumulator
发布日期:2021-05-06 17:45:18 浏览次数:17 分类:原创文章

本文共 1100 字,大约阅读时间需要 3 分钟。

1 为什么还要LongAdder

LongAdder类是JDK1.8新增的一个原子性操作类。高并发的请求下,AtomicLong的cas自旋算法,竞争激烈,导致性能下降。这个类有价值的代码也就几十行。

public class LongAdder extends Striped64 implements Serializable {       public LongAdder() {       }    public void add(long x) {           Cell[] as; long b, v; int m; Cell a;        if ((as = cells) != null || !casBase(b = base, b + x)) {               boolean uncontended = true;            if (as == null || (m = as.length - 1) < 0 ||                (a = as[getProbe() & m]) == null ||                !(uncontended = a.cas(v = a.value, v + x)))                longAccumulate(x, null, uncontended);        }    }    public void increment() {           add(1L);    }    public void decrement() {           add(-1L);    }    public long sum() {           Cell[] as = cells; Cell a;        long sum = base;        if (as != null) {               for (int i = 0; i < as.length; ++i) {                   if ((a = as[i]) != null)                    sum += a.value;            }        }        return sum;    }

这里出现了一个类Cell,这个类是Striped64类的静态内部类,因此当Striped64对象初始化时并不会连带将Cell类初始化,其源码如下

2 LongAccumulator

上一篇:Arrays.sort
下一篇:布隆过滤器

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月15日 02时51分49秒