CAS(compare and swap)

2025/04/03

文章目录

一、背景

为什么要有 CAS,它解决了什么问题?

  1. 解决锁机制的性能问题
  2. 用于无锁并发编程

无锁表现在: CAS 通过硬件指令(如 CPU 的 cmpxchg)直接实现原子操作,线程不会阻塞,而是通过不断重试(自旋)直到成功。

避免死锁,因为根本没有锁。

二、和传统锁的对比

一个例子i++

三、实际的使用

四、存在的问题

(一)ABA 问题

如果值的变化过程如下所示

  1. A -> B
  2. B -> A

CAS 检查时发现没有变,因为起始和结束时值没有发生变化,就去更新,但是在上面两步过程中值其实已经发生了变化。

解决方案: 添加版本号或时间戳的校验

(二)开销问题

长时间自旋不成功,有开销问题。

(三)只能保证一个共享变量的原子问题

那么如何保证多个共享变量的原子问题? todo Java 从 1.5 开始 JDK 提供了 AtomicReference 类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行 CAS 操作。