原子类

AtomicInteger

getAndSet方法   修改值并返回旧值

public final int getAndSet(int newValue) {
        return unsafe.getAndSetInt(this, valueOffset, newValue);   //调用unsafe的方法
    }
public final int getAndSetInt(Object var1, long var2, int var4) { 
        int var5;
        do { 
            var5 = this.getIntVolatile(var1, var2);  //通过对象及value的偏移地址来获得value的值
        } while(!this.compareAndSwapInt(var1, var2, var5, var4)); // var1 对象本身 var2 偏移地址 var 5 旧值 var4 新值 这样就可以原子的修改value的值

        return var5;
    }

在类加载时就会执行静态代码块里的代码,valueOffset就是value在内存中的地址,也就是偏移地址

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

compareAndSet方法

 public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
原文地址:https://www.cnblogs.com/lzh66/p/13230656.html