1.Adder 累加器
高并发下LongAdder 比AtomicLong 效率高,本质是空间换时间
竞争激烈的时候,LongAdder把不同线程对应到不同的Cell上进行修改,降低了冲突的概率,是多段锁的理念,提高了并发性
原因:AtomicLong 在cpu(多核)核心中,假设第一个核心数据改变,为了保证数据的一致性会叫数据flush 到主内存中(共享内存),然后refersh到每个线程所独有的工作内存中。LongAdder 不需要保证不同线程中的数据一致性,只会在自己的工作内存中进行操作,LongAdder 引入了分段累加的概念,内部有一个base变量和Cell[] 数组共同参与计数:
base变量:竞争不激烈,直接累加到该变量上。
Cell[]:数组:竞争激烈,各个线程分散累加到自己的槽Cell[i] 中
源码:
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[]) != null)
sum += a.value,
}
}
return sum,
}LongAdder 适合的场景是统计求和计数的场景
2.LongAccumulator 累加器
适用场景:需要并行执行累加操作并且对执行顺序没有要求,不影响最后结果
for循环是单线程执行