理解CAS
理解CAS
CAS(compare and swap):比较并交换,是CPU并发操作的原语
JUC的atomic包下的类中的操作均为原子性操作,底层均使用的是CAS,是直接对内存的操作
示例代码
package com.example.juc;
import java.util.concurrent.atomic.AtomicInteger;
public class TestCas {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2021);
int andIncrement = atomicInteger.getAndIncrement();
System.out.println(atomicInteger.compareAndSet(2022, 2023));
System.out.println(atomicInteger);
System.out.println(atomicInteger.compareAndSet(2021, 2024));
System.out.println(atomicInteger);
}
}
源码探究
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
// 这个dowhile称为自旋锁
do {
v = getIntVolatile(o, offset);
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}
// native方法是本地方法,调用C++接口实现对内存的操作
public native int getIntVolatile(Object o, long offset);
public final native boolean compareAndSwapInt(Object o, long offset,
int expected,
int x);
cas:(CompareAndSwap)比较当前的值如果是期望的,就更新为新值,否则不变。
cas缺点
- 循环会耗时
- 一次性只能保证一个共享变量的原子性操作
- ABA问题