定义
CAS:Compare and Swap
其中在java中使用CAS底层借助 Unsafe 来操作,实现非阻塞的修改变量值,CAS是使用了硬件指令保证原子性 每次进行compareAndSwap方法时,需要cas有3个参数 内存地址V , 旧的预期值E , 要修改的新值N
- 当
E == V 时,修改 V 值为 N ,返回true - 当
E != V 时,修改失败,返回false
AtomicBoolean,AtomicInteger,AtomicLong 等都是使用CAS来实现的。但是没有解决ABA问题。
什么是ABA问题
一个线程获取值为a,另一个线程将数值由a改成了b,接着又改成了a,此时线程b的CAS操作认为是没有变化,但其实已经变化过了,这种过程就叫ABA问题。
CAS的ABA问题解决
可以使用版本号标志,每当修改操作一次版本号加1,这样比较时候,不管比较值还比较了版本号。但是在java5中,已经提供了AtomicStampedReference
import java.util.concurrent.atomic.AtomicStampedReference;
public class Test {
private static AtomicStampedReference atomicStampedReference = new AtomicStampedReference(100, 0);
public static void main(String[] args) {
while (!incr()) {
}
}
private static boolean incr() {
int stamp = atomicStampedReference.getStamp();
return atomicStampedReference.compareAndSet(100, 101, stamp, stamp + 1);
}
}
CAS缺点
- 循环时间长,开销很大:就是如果CAS失效,就会一直进行尝试,当时间过长仍然失败,那么就会给CPU带来很大的开销
- 不能保证代码块的原子性,只能保证变量的原子性操作
- ABA问题
|