在执行Unsafe的CAS方法时,这些方法首先将内存位置的值与预期值(旧的值)比较,如果相匹配,那么CPU会自动将该内存位置的值更新为新值,并返回true;如果不匹配,CPU不做任何操作,并返回false,自旋再去获取内存地址的值。
比较和设置值是原子操作,中间不会有其它线程打断。通过汇编指令 lock(示情况采用总线锁或者缓存锁) comxchg 实现,保证安全。
Unsafe的CAS操作会将第一个参数(对象的指针、地址)与第二个参数(字段偏移量)组合在一起,计算出最终的内存操作地址,继而得到旧值。
* 定义在Unsafe类中的三个“比较并交换”原子方法
* @param o 需要操作的字段所在的对象
* @param offset 需要操作的字段的偏移量(相对的,相对于对象头)
* @param expected 期望值(旧的值)
* @param update 更新值(新的值)
* @return true 更新成功 | false 更新失败
*
*/
public final native boolean compareAndSwapObject(Object var1,
long var2, Object var4, Object var5);
public final native boolean compareAndSwapInt(Object var1,
long var2, int var4, int var5);
public final native boolean compareAndSwapLong(Object var1,
long var2, long var4, long var6);