数据结构
实际的计数结果由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处,以此提高性能。大致步骤如下:
- 当并发程度不高时,利用CAS操作向base中写入;(写base的CAS操作成功)
- 当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.
参考: