今天咱们分析一下能保证原子性的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