我们都知道原子类LongAdder可以在高并发环境下保证线程安全,因此我们在生产环境也会经常用到它,但是在高并发环境下它的性能却不是那么好。我们该怎么解决呢?
要想解决这个问题,我们必须清楚为什么在高并发环境下,AtomicLong的效率会变低。
AtomicLong底层运用的是CAS
算法,是一种无锁保证线程安全的算法,在一般情况下可以提高我们程序的运行效率,但是在高并发环境下,也会称为我们系统性能的瓶颈。
比如在高并发环境下进行累加操作,我们每做一次加法都会将变量的值同步回主存,由于竞争十分激烈,发生冲突的情况会大大增加(也就是存在大量更新时去比较预期的值发生了变化,导致此次更新失效的情况),因此效率会大大降低
Adder累加器
java8引入的,高并发下LongAdder比AtomicLong(其他基本原子类一样)效率高,不过本质是空间换时间
我们先来看一下他们的累加效率对比:
AtomicLong累加1亿个数
public class AtomicLongDemo implements Runnable {
private AtomicLong sum = new AtomicLong();
public static void main(String[] args) {
AtomicLongDemo atomicLongDemo = new AtomicLongDemo();
ExecutorService executorService = Executors.newFixedThreadPool(20);
Instant start = Instant.now();
for (int i = 0; i < 20; i++)