跳到主要内容

Java并发编程学习十一:CAS

一、CAS简介

CAS,全称是"Compare-And-Swap",中文翻译"比较并交换",是一种思想、算法。

在多线程并发的场景下,为了保证线程安全,可以采用同步互斥锁,典型的就是synchronized关键字。CAS则提供了另一种思路,它并不采用同步的方法,实现了无锁的线程安全。

CAS有三个操作数:内存值 V、预期值 A、要修改的值 B。CAS 最核心的思路就是,仅当预期值 A 和当前的内存值 V 相同时,才将内存值修改为 B。而当预期值 A 和当前的内存值 V 不相同时,认为这次操作失败,实际使用时可以结合自旋锁,循环尝试获取。

在大多数处理器的指令中,都会实现 CAS 相关的指令,这一条指令就可以完成“比较并交换”的操作,也正是由于这是一条(而不是多条)CPU 指令,所以 CAS 相关的指令是具备原子性的,这个组合操作在执行期间不会被打断。

二、CAS的应用

1. 并发容器

JUC并发包中大量使用了CAS技术,下面举例说明

a. ConcurrentHashMap

以该类的putVal 方法为例

final V putVal(K key, V value, boolean onlyIfAbsent) {


if (key == null || value == null) throw new NullPointerException();
int hash = spread(key.hashCode());
int binCount = 0;
for (Node<K,V>[] tab = table;;) {


Node<K,V> f; int n, i, fh;
if (tab == null || (n = tab.length) == 0)
tab = initTable();
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {


if (casTabAt(tab, i, null,
new Node<K,V>(hash, key, value, null)))
break; // no lock when adding to empty bin
}
//以下部分省略
...
}