atomicInteger源码,看看CAS,CAS源码解析

AtomicInteger atomicInteger = new AtomicInteger(12);
int andIncrement = atomicInteger.getAndIncrement();
 private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

1.Unsafe,这是CAS的核心类,因为JAVA方法无法直接访问底层系统,需要通过native方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据,Unsafe类在rt.jar下的sun.misc包中,其内部方法操作可以像C的指针一样直接操作内存,因为java中cas操作的执行依赖Unsafe类的方法;

native方法都是直接调用操作系统底层资源执行相应任务;

AtomicInteger的getAndIncrement就是 原子性的i++操作; 看看源码;

2.变量vlaue用volatile修饰,保证了多线程之间内存可见性;

AtomicInteger的方法; 
 public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

 this代表当前对象,valueOffsest代表内存偏移量,就是这个对象的内存地址,第三个参数,1表示加一;

CAS的全称为compare-and-swap,他是一条cpu并发原语;

它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的;

cas并发原语提现在java语言中就是unsafe类中的各个方法;调用unsafe的cas方法,jvm会帮我们实现出cas汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于cas是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成一定功能的一个过程,rimitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。就是说cas是一跳cpu的原子质量,不会造成所谓的数据不一致问题;

unsafe类的这个方法;unsafe是rt.jar下的 sun.misc包下的类  

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;
    }

,这一步这个循环是,var5是根据对象本身和valueoffset地址内存偏移量拿到对象中的内存值;然后进行compareandswap,如果成功,

!true,就是false 跳出循环,返回var5;

 

你可能感兴趣的:(atomicInteger源码,看看CAS,CAS源码解析)