CAS-一看就懂了点

999 阅读2分钟

介绍

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也就有一个大概印象了。本文暂且也就到这里~