Java基础之LongAdder

数据结构

  实际的计数结果由base和Cell数组两部分组成,当需要读取结果时只需要将base和Cell的value累加即可。
这里写图片描述

    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;
    }

实现原理

  当前的计算机体系,还无法支持同一存储处的并行写入,依然是串行写入。当并发程度过高时,即使CAS操作性能也存在瓶颈。LongAdder的思想是当并发过高时,利用Cell数组分摊竞争,避免所有的写操作都落在base处,以此提高性能。大致步骤如下:

  1. 当并发程度不高时,利用CAS操作向base中写入;(写base的CAS操作成功)
  2. 当base竞争过高时,利用CAS操作向Cell数组写入;(写base的CAS操作失败,写cell的CAS操作成功);

LongAdder VS AtomicInteger

  低并发场景下两者性能接近,高并发场景下LongAdder性能更优,代价需要占用额外的空间。

Under low update contention, the two classes have similar characteristics. But under high contention, expected throughput of this class is significantly higher, at the expense of higher space consumption.

参考:

  1. https://coolshell.cn/articles/11454.html
  2. https://stackoverflow.com/questions/30691083/how-longadder-performs-better-than-atomiclong
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值