JAVA原子操作的实现以及原理入门

JAVA原子操作

JAVA的原子操作是由java.util.concurrent.atomic 包提供的。如下:

JAVA类功能描述
AtomicInteger整型原子类
AtomicIntegerArray整型数组原子类
AtomicLong长整型原子类
AtomicLongArray长整型数组原子类
AtomicBoolean布尔型原子类
AtomicReference对象原子类
AtomicReferenceArray对象数组原子类
AtomicIntegerFieldUpdater反射整型原子类,用于反射机制下的整型原子类的操作
AtomicLongFieldUpdater反正长整型原子类,用于反射机制下的长整型原子类的操作
AtomicStampedReference带有标记的原子操作防止ABA问题
DoubleAdderJDK1.8的原子double型操作,优化了高并发下自旋锁的性能瓶颈
LongAdderJDK1.8的原子long型操作
DoubleAccumulatorJDK1.8的原子double型通用操作类,优化了高并发下自旋锁的性能瓶颈
LongAccumulatorJDK1.8的原子long型通用操作操作

JAVA CAS操作实现原理

以AtomicLong和LongAdder的源码为例来看一下如何实现的原子操作。
实现AtomicLong最核心的两个Native方法:

  • getLongVolatile(Object obj, long offset) =>根据地址偏移量获取对象的值
  • compareAndSwapLong(Object obj, long offset, long expect, long update) =>原子操作进行变量值的更新
    long var6;
    do {
        var6 = this.getLongVolatile(var1, var2);
    } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4));
    
    return var6;

getLongVolatile通过offset获取内存地址的值,然后compareAndSwapLong通过与实际地址的值比较判断,如果相等则将替换成新值,不相等则循环直到成功为止。
该代码通过自旋锁来实现数据的一致性,但是有个问题就是如果高并发的情况下,可能一直循环从而造成一定的cpu时间的浪费,因此在JDK1.8当中提出了LongAdder。
LongAdder新增了cell概念,将数据保存到cell中,通过sum将数据进行整合,优化了高并发出现的资源浪费的问题。如下图
在这里插入图片描述

JAVA原子验证

public void add() throws InterruptedException {
        for(int i =0;i<1000;i++){
            new Thread(()->{
                l++;
                atomicLong.incrementAndGet();
            }).start();
        }
        Thread.sleep(3000L);
        System.out.println("atomicLong : " + atomicLong.get() +" long : " +l);

    }

结果:atomicLong : 1000 long : 983

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值