CAS 是比较并交换,是实现并发算法时常用到的一种技术。当内存的值和期望的值相等时,进行更新,否则 什么都不做 或 重来 。
CAS 的底层实现:是靠硬件实现的,靠硬件的原子性实现,CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题。
重来==>
自旋CAS 类似乐观锁,乐观的认为别人没有修改,当值还是预期值,就进行修改,否则可能什么都不做,或者重来。
■ 原子类==> 底层思想/工作原理 CAS ==> Unsafe 类的CPU 原语级别的汇编操作
CAS 是靠硬件实现的,靠硬件的原子性实现,CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,
Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。
■ AtomicInteger 类主要利用 CAS + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。
new AtomicInteger().compareAndSet(0, 1);
// 底层实现
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
new AtomicInteger().getAndAdd(1);//获取到当前值并加1
// 底层实现
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
■ 工作中,不建议使用Unsafe 类,类名就提示你了"不安全"!
是CAS的核心类像C的指针一样直接操作内存Unsafe类中的所有方法都是native修饰的,Unsafe类中的方法都可以直接调用操作系统底层资源去执行相应任务//原子类
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
private volatile int value;
变量valueOffset,表示该变量值在内存中的偏移地址,因为 Unsafe就是根据内存偏移地址获取数据的。
变量value用volatile修饰,保证了多线程之间的内存可见性。每次获取的值都是最新的。
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!