CAS操作
贴一个 AtomicInteger 实现主要原理,
AtomicInteger 类解释:
- private volatile int value; value设置为volatile 是保证内存可见性,杜绝缓存一致性问题,不管哪个cpu读取到的都是内存最新值而不是cpu自己缓存的值。
- unsafe是直接操作内存的一个类,参考:https://www.jianshu.com/p/db8dce09232d
- unsafe.getAndSetInt(this, valueOffset, newValue):
- this, valueOffset:当前类,偏移量,这俩个值直接确定内存地址。
- 每个field的偏移量是根据当前类型(Class)来的。java对象内存布局参考 https://blog.csdn.net/qq_30054961/article/details/88345030、https://www.cnblogs.com/plxx/p/4642405.html
Unsafe类解释:
- var5 = this.getIntVolatile(var1, var2); 获取操作前的数值 (也就是该内存地址现在的数值)。
- while(!this.compareAndSwapInt(var1, var2, var5, var4)) 一直尝试cas操作。
- var1,var2 直接确定内存地址。
- var5 当前值
- var4 目标值
- compareAndSwapInt(CAS)操作含义 var1、var2 所在内存地址的值如果等于var5 就将该内存地址设值为 var4.