Administrator
发布于 2024-11-03 / 5 阅读
0

原子类

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循环是单线程执行