CAS 是什么?
CAS (compare and swap) :: 比较并交换
如果期望的值达到了,那么就更新,否则,就不更新,CAS 是 CPU 的并发原语
unsafe 类
Java 无法操作内存,但是Java 可以调用 C++, C++ 可以操作内存。unsafe 相当于 Java 的后门,可以通过这个类操作内存
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
// CAS 是自旋锁
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;
}
CAS:比较当前内存中的值和主内存中的值,如果这个值是所期望的值,那么就执行操作,如果不是就一直循环
缺点:
- 循环会耗时
- 一次性只能保证一个共享变量的原子性
- ABA问题
CAS :ABA 问题
简单来说:线程A和线程B 都操作主存中同一资源时,如果主存中变量C 原为 1;被线程A改为2之后再次改为1,此时线程是无法判断变量C有无被其他线程修改过。