回答
CAS
,Compare And Swap,即比较并交换,它一种无锁编程技术的核心机制。其工作方式分为两步:
- 比较:它首先会比较内存中的某个值(V)与预期的值(A)是否相等。
- **交换:**如果相等,那么会自动将该值(V)更新为新值(B)。如果不相等,不做任何操作。
这个过程是原子操作,保证在并发环境中的数据一致性和线程安全。
CAS
主要存在如下三个问题:
- ABA 问题:如果变量 V 的值原先是 A,然后被其他线程改为 B,然后又改回 A,这时
CAS
操作会误认为自从上次读取以来 V 没有被修改过,从而可能产生错误的操作结果。 - 循环时间过长问题:
CAS
操作如果长时间不成功,会不断进行重试,这可能会导致线程长时间处于忙等(Busy-Wait)状态,从而导致 CPU 长时间做无效操作。 - 多变量原子问题:
CAS
只能保证一个变量的原子操作。
详解
CAS 详解
CAS
,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用 CAS
技术鬼斧神工地实现了Java多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基于 CAS
实现的,可以说CAS
是整个 JUC 的基石。
在CAS中有三个参数:内存值 V、旧的预期值 A以及要更新的值 B。它涉及两个操作:
- 比较:首先比较内存位置的当前值 V 和预期原值 A 是否相等,即
V == A ?
- 交换:如果相等则将该位置值更新为新值,即
set B → V
用伪代码表示:
if(this.value == A){
this.value = B
return true;
}else{
return false;
}
流程图如下: