CAS是compare and swap的缩写,即我们所说的比较交换。

cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源 锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽 泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加version来获取数据,性能较 悲观锁有很大的提高。

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存地址里 面的值和A的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据 的,若果在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到 下次循环才有可能机会执行。

java.util.concurrent.atomic 包下的类大多是使用CAS操作来实现的(AtomicInteger,AtomicBoolean,AtomicLong)。