介绍
CAS:Compare and Swap,比较并交换。对于并发,锁是一种悲观策略,会阻塞线程执行。科技发展,自然而然就会渴求乐观策略,无锁就是一种概念上的体现。对于无锁的一种技术支持就是CAS。
阅读
目前我所见到的对CAS的使用,都是通过Unsafe类支持的。CAS有3个操作数V(内存值,真正的共享的内存值,不是缓存中的),A(期待值或者说缓存中的值),B(修改的新值)。我们以AtomicInteger的compareAndSet方法来让我们对3个操作数有个具象化的了解(核心也就是了解这3个操作数)。
compareAndSet
public final boolean compareAndSet(int expect, int update) {
// U就是Unsafe类
// private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
return U.compareAndSwapInt(this, VALUE, expect, update);
}
Unsafe类的compareAndSwapInt的实现是native的,就是C++的实现。它是一个原子操作。他的原子性就是通过CAS这么个原子指令实现的,由处理器保证。如果你想有更多了解,点这里
- VALUE 即CAS中的V。他是如何获取的呢?
static {
try {
// 你看,还是Unsafe类提供的方法。配合反射拿到value Field对应的实际内存中的值
VALUE = U.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (ReflectiveOperationException e) {
throw new Error(e);
}
}
- expect 即CAS中的A
// value 即A 使用volatile保证其线程可见性
private volatile int value;
// 通过此方法获取value
public final int get() {
return value;
}
- update 即CAS中的B 通常新值是通过函数式编程形式提供的函数计算出来的
public final int getAndUpdate(IntUnaryOperator updateFunction) {
int prev, next;
do {
prev = get();
next = updateFunction.applyAsInt(prev);
} while (!compareAndSet(prev, next));//注意这个循环条件,CAS操作失败控制继续尝试
return prev;
}
相信,到这里,我们队CAS也就有一个大概印象了。本文暂且也就到这里~