Atomic原子类介绍

1:类介绍

  在jdk里面提供的原子操作类有4中类型分别是针对原子更新基本类型如Integer,Boolean,Long类型,原子更新数组如AtomicIntegerArray,AtomicLongArray和AtomicReferenceArray对应的是整形数组,长整型数据以及引用数组,还有原子更新引用和原子更新属性。

1.1:原子更新基本类型

  以AtomicInteget为例子我们分析其内部的方法。

  1. int addAndGet(int delta),以原子方式,将输入数值和实例的数值即AtomicInteger的value相加,并返回。
  2. boolean compareAndSet(int expect,int update)如果输入值等于预期值则以原子方式将该值设置为输入值。

  我们打开addAndGet的源码,探究是如何保证能以原子操作将数值相加的尼?

    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

  搜先通过获取volatile的变量,然后通过CAS算法不断地比较,如果变量没有变化,则进行相加即可,并返回true以跳出循环。如果变量发生变化,则compareAndSwapInt修改不成功,返回false,则再次进入while循环,不断进行CAS比较,直到能修改成功为止。

  CAS算法为什么是硬件级别算法?这是因为有专门地CMPXCHG指令,这是一条汇编指令,所以CPU一次通过,是原子操作。

  

 

posted @ 2020-04-14 19:23  大朱123  阅读(611)  评论(0编辑  收藏  举报