CAS
CAS : Compare And Swap (比较与交换)
CAS 操作包含三个操作数:内存位置(V)、预期原值(A)和新值(B)
当且仅当预期原值(A)与内存位置(V)的值相同时,才会将内存位置(V)的值更新为新值(B),否则不会更新值,不断循序重试;
class AtomicInteger {
private int value;
public int incrementAndGet() {
int oldValue;
int newValue;
do {
oldValue = value;
newValue = oldValue + 1;
} while (!compareAndSwap(oldValue, newValue));
return newValue;
}
private boolean compareAndSwap(int expectedValue, int newValue) {
// 这里是底层的 CAS 操作,如果当前值与预期值相同,就将其更新为新值
if (value == expectedValue) {
value = newValue;
return true;
}
return false;
}
}
应用场景
CAS: 适用于 读多写少, 比如:成绩更正、核酸录入
synchronized: 使用并发量不大且接受一定延迟场景, 比如:订单退费
性能分析
CAS: 无锁技术,性能高于synchronized同步锁
synchronized同步锁: 线程阻塞到唤醒会频繁 发生 线程上下文切换, 耗费性能
不积跬步,无以至千里;不积小流,无以成江海。