并发编程 CAS

本文将介绍并发编程中的 CAS,即比较并交换指令。

一、CAS 指令

CPU 提供了 CAS,Compare And Swap,即比较并交换指令。

该指令包含 “变量地址 A”、”值 B”、”新值 C” 等三个参数,当且仅当 “变量地址 A” 所指向的地址的值等于 “值 B” 时,将 “变量地址 A” 所指向的地址的值修改为 C。

作为一条 CPU 指令,CAS 指令能够保证原子性。

二、CAS 与自旋配合使用

CAS 指令常和自旋配合使用,具体来说 :通过 CAS 指令进行操作,并通过 “自旋” 的方式保证操作成功。

所谓自旋,就是循环尝试,假如 CAS 指令执行过程中发现 “变量地址 A” 的值与 “值 B” 不符,说明其值已经被其它线程修改,此时应该继续执行 CAS 指令,直至成功。

1
2
3
do {
// CAS
} while (CAS未执行成功)

三、CAS 的问题

1. ABA 问题

假如在 CAS 指令执行过程中,”变量地址 A” 的值经历了 A -> B -> A 的变化,它将无法检查出来,并且会继续执行。

解决思路:

  • 如果 ABA 问题不影响最终结果,可以忽略
  • 增加版本号,在每次修改时更新版本号

2. 指针问题

假如 “变量地址 A” 的值是一个指针,只要指针值不发生改变,即使指针指向的值发生了变化,CAS 指令就无法检查出来。

参考

  • Java 并发编程实战