目录
什么是CAS
-
应用场景:并发
-
我认为V的值应该是A,如果是的话,那我就把它修改成B,如果不是A(说明被别人修改过了),那我就不修改了,避免多人同时操作导致出错。
-
CAS有三个操作数:内存值V、预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做,最后返回现在的V值。
-
利用了CPU的特殊指令
-
CAS的等价代码(语义)
public class SimulatedCAS {
private volatile int value;
/**
* 使用synchronized保证其原子操作
* @param expectValue
* @param newValue
* @return
*/
public synchronized int compareAndSwap(int expectValue,int newValue){
int oldValue = value;
if(oldValue == value){
value = newValue;
}
return oldValue;
}
}
应用场景
-
乐观锁
-
并发容器
-
原子类
以AtomicInteger为例,分析在Java中如何利用CAS实现原子操作的
- AtomicInteger加载Unsafe工具,用来直接操作内存数据
- 用UnSafe来实现底层操作
- 用volatile修饰value字段,保证可见性
- getAndAddInt方法分析
Unsafe类
Unsafe类中的compareAndSwapInt
Unsafe的native实现方法底层源码, Atomic::cmpxchg(x,addr,e),
缺点
- ABA问题:添加版本号解决
- 自旋时间过长 do while