开始之前先说下AtomicInteger类中的几个成员

private static final Unsafe unsafe = Unsafe.getUnsafe(); //Unsage是Java中用来直接对内存进行管理的一个对象
private static final long valueOffset;   //偏移量,存储数据的内存地址就是对象+偏移量来获取的
private volatile int value;           //用来获取valueOffset的偏移地址,可通过偏移地址直接获取这个值

 

 

 

//demo

public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 100) + "\t current data:" + atomicInteger.get()); //true	 current data:100

        System.out.println(atomicInteger.compareAndSet(5, 200) + "\t current data:" + atomicInteger.get());//false	 current data:100
    }



 


//源码

/*
 * 
 *  expect 期望的值 
 *  update 更新的值 
 *  
 */

public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }


/*
 * 
 *  compareAndSwapInt这个是本地方法,作用是通过对象和偏移地址获取value后与期望值expect比较
 *  如果相等将内存中的值替换为update
 */
  public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

 

Rick  11浏览  0评论  2020-10-12

上一篇