CAS算法

一、算法

CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS比较与交换的伪代码可以表示为:

do{

备份旧数据;

基于旧数据构造新数据;

}while(!CAS( 内存地址,备份的旧数据,新数据 ))
例如AtomicInteger中的增加代码

   public final int getAndAccumulate(int x,
                                     IntBinaryOperator accumulatorFunction) {
       int prev, next;
       do {
           prev = get();
           next = accumulatorFunction.applyAsInt(prev, x);
       } while (!compareAndSet(prev, next));
       return prev;
   }

其中比较的代码为

   private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
   public final boolean compareAndSet(int expect, int update) {
       return U.compareAndSwapInt(this, VALUE, expect, update);
   }

U.compareAndSwapInt实现的是cpu指令级别的操作

二、比较

  • 与悲观锁相比,大大提高了效率,悲观锁的挂起需要上下文的切换,消耗资源很大。
  • 不能完全阻止脏读的产生,如果在“比较后交互”之前发生了数据变化,后来又恢复了数据变化,但是整个过程对其它数据产生了影响,就会产生脏读。

你可能感兴趣的:(CAS算法)