23-CAS

nobility 发布于 2021-06-16 406 次阅读


CAS

CAS(Compare-and-Swap)比较和交换,是一种实现线程安全的算法同时也是一个CPU指令,用来做哪些不能被打断的数据交换操作,是乐观锁、原子类和并发集合的底层原理

基本思路:记录要修改的原先值,在当前线程要修改时,对比之前的记录若被修改过了,就放弃本次修改,返回记录的原先值,避免多个线程进行修改时导致出错

CAS有如下缺点

  • ABA问题:CAS只是检测是否与记录值相等,并不是检测是否被修改过,所以若被修改过的值和记录值相等,就有可能出现错误
  • 自旋时间过长:若竞争非常激烈,导致锁一直获取不到,就会导致自旋白白消耗CPU

由于CAS需要利用到CPU的特殊指令(Java中会使用Unsafe工具来直接操作内存,来实现硬件级别的原子操作),所以只能写出等价代码,具体如下

public class CAS {
  private volatile int value;  //模拟寄存器,需要多个线程可见所以加volatile

  public synchronized int compareAndSwap(int expectedValue, int newValue) {  //使用synchronized模拟成CPU一条指令
    int oldValue = value;  //记录原先值
    if (oldValue == expectedValue) {  //对比是否修改过
      value = newValue;  //没修改过就进行修改
    }
    return oldValue;  //修改过就不修改,返回原先值
  }

  public static void main(String[] args) throws InterruptedException {
    CAS cas = new CAS();
    cas.value = 0;
    Runnable runnable = () -> cas.compareAndSwap(0, 1);
    Thread t1 = new Thread(runnable);  //debug可以看出只有一个线程修改成功
    Thread t2 = new Thread(runnable);
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(cas.value);
  }
}
此作者没有提供个人介绍
最后更新于 2021-06-16