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