什么是CAS

  • 一种思想,一种算法,用在并发的场景下
  • 我认为内存值V应该是A,如果是的话我就把它改成B,如果不是A说没就被别人改过了,那我就不修改了,避免多人修改导致出错
  • CAS有三个操作数:内存值V,预期值A,修改值B,并且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做,最后返回现在的V值

演示CAS核心原理

通过代码模拟CAS的操作

/** * 描述: 模拟CAS操作,等价代码 */ public class SimulatedCAS { private volatile int value; public synchronized int compareAndSwap(int expectedValue, int newValue) { //内存值V int oldValue = value; //预期值A等于内存值V if (oldValue == expectedValue) { //将修改值B赋值给内存值V value = newValue; } //返回内存值V return oldValue; } } 

CAS应用场景

  • 乐观锁的底层实现
  • 并发容器底层有应用,如ConcurrentHashMap
  • 原子类底层有应用

CAS的缺点

  • ABA问题:内存值V被其他线程多次修改,最终又改回了预期值A,但是这种修改再上述规则发现不了。

    • 举例:预期值为5,内存值最初为5,被另一个线程改为7,然后又被改成5,此时预期值与内存值进行值的比较发现没有变化,就认为中途没有其他线程操作
    • 优化方案,类比数据库中的乐观锁,对数据加上版本号
  • 自旋循环时间长开销大

  • 只能保证一个共享变量的原子操作


本文参考了


更多Java面试复习笔记和总结可访问我的面试复习专栏《Java面试复习笔记》,或者访问我另一篇博客《Java面试核心知识点汇总》查看目录和直达链接