CAS算法

2018-03-08  本文已影响0人  倦飞知还

一、算法

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指令级别的操作

二、比较

上一篇下一篇

猜你喜欢

热点阅读