是什么?
CAS是Java中Unsafe类里面的一个方法,它的全称叫compareAndSwap,比较并替换的意思,它的主要功能是能够保证在多线程环境下,对于共享变量修改的一个原子性。对于像read-write这样的操作,我们一般会加锁保证原子性问题,但是加同步锁一定会带来性能上的损耗,所以可以用CAS+volatile的方式来优化
例子
compareAndSwapInt四个参数分别是:对象实例、成员变量state在内存地址中的一个偏移量、预期值0、期望更改的值1
public class test{
private volatile int state = 0;
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long stateOffset;
static {
try{
stateOffset = unsafe.objectFieldOffset(test.class.getDeclaredField("state"));
} catch (Exception ex){ throw new Error(ex);}
}
public void doSomething(){
if(unsafe.compareAndSwapInt(this,stateOffset,0,1)){
// TODO
}
}
}
CAS机制会去比较state内存地址偏移量对应的值和传入的预期值0是否相等,如果相等就直接修改内存地址中state的值等于1,否则返回false,这个过程是一个原子的,不会有线程安全问题。
补充知识
compareAndSwap其实是一个native方法,它最终还是会面临同样的问题,就是先从内存地址中读取state值,然后比较,最后再去修改,这个过程不管什么层面去实现都会有原子性问题,所以它的底层实现里,如果在多核CPU环境下会增加一个lock指令来对缓存或者总线去加锁,从而保证比较并替换两个操作的原子性