本文共 575 字,大约阅读时间需要 1 分钟。
在阿里巴巴编码规范中,LongAdder相比AtomicLong在高并发场景下展现出更高的效率,主要原因在于减少了AtomicLong空自旋带来的效率损耗。这种优势来源于LongAdder采用了热点分离的思想,从而降低了并发更新时的竞争率。
然而,LongAdder在并发更新时也存在一个潜在问题:当发生并发计数时,可能会导致最终结果不正确。这种情况通常发生在多个线程同时尝试修改计数器时,可能会导致数据竞争,进而影响最终的计数结果。
以下是LongAdder的实现代码:
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;}
这个方法返回当前的总和。需要注意的是,返回的值并非一个原子性快照。在没有并发更新时,方法能够返回准确的结果。但在存在并发更新的情况下,可能会因为并发修改而导致最终结果不正确。
转载地址:http://cnufk.baihongyu.com/