原子类AtomicLong在高并发环境下性能不好,怎么解决?LongAdder解决及原理分析

我们都知道原子类LongAdder可以在高并发环境下保证线程安全,因此我们在生产环境也会经常用到它,但是在高并发环境下它的性能却不是那么好。我们该怎么解决呢?要想解决这个问题,我们必须清楚为什么在高并发环境下,AtomicLong的效率会变低。AtomicLong底层运用的是CAS算法,是一种无锁保证线程安全的算法,在一般情况下可以提高我们程序的运行效率,但是在高并发环境下,也会称为我们系统性能的瓶颈。比如在高并发环境下进行累加操作,我们每做一次加法都会将变量的值同步回主存,由于竞争十分激烈,发生冲突
摘要由CSDN通过智能技术生成

我们都知道原子类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++) 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值