AtomicInteger方法解析

public class AtomicIntegerTest {

        public static void main(String[] args) {

            AtomicInteger at = new AtomicInteger(2);
            int andSet = at.getAndSet(12);

            int i = at.get();

            System.out.println("获取结果:" + andSet);
            System.out.println("获取结果:" + i);
        }
}
public final int getAndSet(int newValue) {
            return unsafe.getAndSetInt(this, valueOffset, newValue);
}
public final int getAndSetInt(Object var1, long var2, int var4) {

          int var5;

          do {
              var5 = this.getIntVolatile(var1, var2);
          } while(!this.compareAndSwapInt(var1, var2, var5, var4));

          return var5;
}
public final boolean compareAndSet(int expect, int update) {
        /**
        * this: 		当前对象
        * valueOffset:	内存偏移量,内存地址
        * expect:		期望的值(旧的值)
        * update: 		更新的值(新的的)
        */
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

compareAndSwapInt方法的思路是拿到对象 this 和 valueOffset 后会再去取主内存的当前值,如果当前值与之前取的期望值expect是一致,就认为 value 没有被修改过,

直接将 value 的值更新为 update,这样就完成了一次 CAS 操作,CAS 操作是通过操作系统保证原子性的。

posted @ 2024-06-03 17:59  jock_javaEE  阅读(23)  评论(0)    收藏  举报