`

java比AtomicLong 更高效的LongAdder

 
阅读更多
AtomicLong 是通过cas来实现的,已经很高效了,还有不有优化的空间呢。
我们知道AtomicLong在高并发的时候,可能要尝试多次才能成功。
AtomicLong的作者是Doug lea ,他的想法是把竞争分散:
具体的做法是把一个数拆成多个数的和,修改的时候只改其中一个数,这样冲突的概率减少很多。


具体做法

  transient volatile long base;

    transient volatile Cell[] cells;




修改
 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);
        }
    }


修改的时候,首先参数修改base,如果不成功,会去修改数组中的一个数

得到结果
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;
    }


结果是 base和一个数组所有数的和。
一些人说,base和数组中的数都是一直在改的,会不准,不过这个没关系。高并发的时候也不可能准,反正看到的都是瞬时的值。

 
 
0
7
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics