什么是CAS
CAS:Compare and Swap,即比较再交换。
CAS的原理:
- CAS并发原语体现在Java语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过他实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题
jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。
package com.qi.demo01.CAS;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author zjq
* @date 2020/3/30 21:58
*/
public class CASDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2020);
/**
* public final boolean compareAndSet(int expect, int update) {
* return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
* }
*/
//如果期望达到了,就更新。否则,就不更新。 CAS是CPU的并发原语。
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger.get());
atomicInteger.getAndIncrement();//===num++
// System.out.println(atomicInteger.compareAndSet(2020, 2021));
// System.out.println(atomicInteger.get());
}
}
unsafe类
CAS:比较并交换,比较当前工作内存中和主内存的值,如果这个值是期望的,那么执行操作,如果不是就一直循环!
缺点:
- 循环耗时
- 一次性只能保证一个共享变量的原子性
- ABA问题。