AtomicInteger对象及CAS原理相关记录

在Java中,对一个整数a执行“a++”运算,在单线程的情况下是没有任何问题的,但是对于多线程的情况来说,就有可能产生线程安全问题。考虑到这个问题,Java中存在一个具有原子性的类型AtomicInteger,它的出现能够很好的解决这个情况。

原始类:

public class TestDemo1 {
 
    public static volatile int num = 0;
 
    public static void add() {
        num++;
    }
}

使用AtomicInteger类:

public class TestDemo2 {

    // AtomicInteger类中已经携带了Volatile关键字
    public static AtomicInteger num = new AtomicInteger(0);
 
    public static void add() {
        // 下方的方法代表线程安全的自增方法
        num.getAndIncrement();
    }
}

附上AtomicInteger类的内部实现

AtomicInteger内部实现


Compare and Swap(CAS),解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

其实上述的AtomicInteger类中的getAndIncrement()方法,底层实现如下:

getAndIncrement方法

可以看到其中使用到Unsafe类,它是CAS的核心类,存在于sun.misc包中,Unsafe类中所有的方法都是native的,故其基本都是直接调用底层资源来执行相关的任务。而Unsafe类对象的getAndAddInt()方法内部实现如下:
getAndAddInt方法

其中参数var1对应上方的this,var2对应上方的valueoffset,var4则对应上方的增值,通过getIntVolatile方法获取当前主内存中对应地址的值(预期原值),并将其赋值给var5,此时再执行while中的compareAndSwapInt方法对预期原值进行运算并返回,此时会再次获取一次主内存中的值跟预期原值进行比较,若相同则进行计算并返回,若不同则更新预期原值。

你可能感兴趣的:(AtomicInteger对象及CAS原理相关记录)