美文网首页
LongAdder原理

LongAdder原理

作者: 抬头挺胸才算活着 | 来源:发表于2020-06-10 21:13 被阅读0次

    参考资料:
    并发编程.pdf

    使用AtomicLong 与 LongAdder效率对比,大概在4倍左右。

    1000000 cost:43
    1000000 cost:9
    1000000 cost:7
    1000000 cost:7
    1000000 cost:7
    
    1000000 cost:31
    1000000 cost:27
    1000000 cost:28
    1000000 cost:24
    1000000 cost:22
    
    • add原理
      加的时候首先尝试用CAS对base进行加,如果失败,那么转而对cell进行累加。
      对cell进行累加需要查看cell是否存在,存在进行累加,如果不存在或者累加失败,直接调用longAccumulate对cells进行扩容
    public void add(long x) {
        Cell[] cs; long b, v; int m; Cell c;
        // cells已经存在或者CAS失败
        if ((cs = cells) != null || !casBase(b = base, b + x)) {
            boolean uncontended = true;
            // cells不存在或者长度为0
            if (cs == null || (m = cs.length - 1) < 0 ||
                    // 取余看对应的cell是否存在
                    (c = cs[getProbe() & m]) == null ||
                    // 设置是否成功
                    !(uncontended = c.cas(v = c.value, v + x)))
                longAccumulate(x, null, uncontended);
        }
    }
    
    • longAccumulate原理
      比较复杂,有空再看看

    相关文章

      网友评论

          本文标题:LongAdder原理

          本文链接:https://www.haomeiwen.com/subject/vadbzhtx.html