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 操作是通过操作系统保证原子性的。

浙公网安备 33010602011771号