CAS Compare and Swap

一种高效实现线程安全性的方法

  • 支持原子更新操作,适用于计数器,序列发生器(给变量自增)等场景。
  • 属于乐观锁机制,号称lock-free。
  • CAS操作失败时由开发者决定是继续尝试,还是执行别的操作。

CAS思想

  • 包含三个操作数——内存位置(V)、预期值(A)和新值(B)
  • 执行时将内存位置的值与预期值比较,相等则改为新值,不同则不做操作

CAS多数情况下对开发者来说是透明的

  • J.U.C的atomic包提供了常用的原子性数据类型以及引用、数组等相关原子类型和更新操作工具,是很多线程安全程序等首选。
  • Unsafe类虽然提供CAS服务,但因能够操纵任意内存地址读写而有隐患
  • Java 9 以后,可以使用Variable Handle API来替代Unsafe

CAS缺点

  • 若循环时间长 ,则开销很大
  • 只能保证一个共享变量的原子操作
  • ABA问题
    • 如果内存地址V初次读取到的值是A,在准备改变时发现仍然是A,就默认其没被改变过,但实际上可能被改成A又被改成B。
    • 解决:AtomicStampedRefernce,带有标记的原子引用类。通过控制变量值的版本来保证CAS的正确性