jdk源码之AtomicInteger源码注释

        今天咱们分析一下能保证原子性的Atomic系列,Atopic类是各类技术源码中,包括咱们开发中,使用频率比较高的一个模块,因此咱们必定要好好掌握这个知识。Atomic系列有不少,可是咱们只须要分析清楚其中的一个,其实其他的就很容易理解了。今天挑的是AtomicInteger分析的源码。java

        咱们先理解一下AtomicInteger的原理:函数

        

     

咱们使用场景驱动的方式去分析。
public class AtomicDemo {
    public static void main(String[] args) {
//步骤一:先分析一下构造函数
        AtomicInteger atomicInteger = new AtomicInteger(0);
//步骤二:让值递增,属于核心方法
        atomicInteger.incrementAndGet();
    }
}

步骤一:先分析一下构造函数
//构造函数很简单,不过咱们须要注意的是
//value的类型是volatile类型的,也就是说value
//这个值是具备可见性的
public AtomicInteger(int initialValue) {
    value = initialValue;
}

步骤二:接下来分析最重要的一个方法。
public final int incrementAndGet() {
//首先咱们要知道unsafe这个是 用c语言开发的
//这个对象咱们用户是使用不了的,只能jdk底层使用
//以下这句话的语义是:this表明的是AtomicInteger这个对象,valueOffset表明的是
//value这个属性在AtoimcInteger类中的哪一个位置
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}

public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
//获取到当前value的值
        var5 = this.getIntVolatile(var1, var2);
//注意这儿作的是一个cas的操做
//compareAndSwapInt(this,valueOffset,value,value+1)
//这个方法的语义就是,先靠 this对象(var1)和valueOffset(var2)两个参数
//获取到value的位置,而后再用刚刚获取到的value(var5)对比
//比较此时此刻的是仍是以前var5这个值吗?若是是那么就 执行 value + 1(var4)
 //操做。这样就cas操做成功,cas成功就返回ture,退出
//若是不成功就返回false,继续循环。一直到成功为止。
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

 Atomic类的源码是比较简单的,分析Atomic类的时候,咱们要重点掌握CAS这个知识。this

  搞定,手工!atom

相关文章
相关标签/搜索