CAS原理详解

books 本文包含知识点

  • CAS是什么?
  • CAS应用场景及原理
  • CAS的不足

books 1.CAS是什么?

CAS是Compare And Swap的缩写,比较并更新,是非阻塞同步的实现原理,它是CPU硬件层面的一种指令,从CPU层面能保证"比较并更新"两个操作的原子性。CAS指令操作包括三个参数:内存值(内存地址值)V、预期值A、新值B,当CAS指令执行时,当且仅当预期值A和内存值V相同时,才更新内存值为B,否则就不执行更新,无论更新与否都会返回否会返回旧的内存值V,上述的处理过程是一个原子操作。用java代码等效实现一下CAS的执行过程:

/**
 * @description CAS等价代码
 **/
public class CASTest {

    //内存值
    private volatile int ramAddress;

    /**
     * @param exceptRecord 期望值
     * @return newRecord 新值
     **/
    public synchronized int compareAndSwap(int exceptRecord, int newRecord) {
        int oldRamAddress = ramAddress;
        if (oldRamAddress == exceptRecord) {
            ramAddress = newRecord;
        }
        return oldRamAddress;
    }
}

books 2.CAS应用场景及原理

  • 原子类:JUC包下的原子类,比如AtomicInteger原子类的incrementAndGet()方法
  • 并发容器:比如ConcurrentHashMap的put()方法
  • 乐观锁:比如数据库层面的乐观锁操作,我们通过版本号字段来实现

鉴于CPU操作是非常敏感的,一不小心就可能搞挂机器,所以像CAS这样的CPU指令集并没有向广大开发人员开放,在jdk中被封装在sun.misc.Unsafe类里面,主要体现在Unsafe类的compareAndSwapInt()、copareAndSwapLong()等几个方法包装提供,通过Unsafe工具类来直接操作内存。查看源码我们可以看到这几个方法都是native修饰符修饰的,表示本地方法,本地方法就是指方法的实现体不在当前文件,而是在用其它语言实现的文件中。下面以AtomicInteger原子类为例,简单剖析下源码:

发布了202 篇原创文章 · 获赞 571 · 访问量 147万+

猜你喜欢

转载自blog.csdn.net/fanrenxiang/article/details/104287656