CAS全称 Compare And Swap(比较与交换),可以在不使用锁的情况下实现多线程之间的变量同步
CAS算法涉及到三个操作数:
- 需要读写的内存值 V。// 线程在计算前,经过拷贝A得到的旧变量值
- 进行比较的值 A。 // 变量在主内存中的值
- 要写入的新值 B。// 线程经过计算后,得到的新变量值
执行逻辑
if(A == V){
V = B ;
}
CAS是原子级的操作
CAS的三大问题
ABA问题
ABA问题的解决思路就是在变量前面添加版本号,这样变化过程就从“A-B-A”变成了“1A-2B-3A”。
循环时间长开销大
CAS操作如果长时间不成功,会导致其一直自旋,给CPU带来非常大的开销。
只能保证一个共享变量的原子操作。
对一个共享变量执行操作时,CAS能够保证原子操作,但是对多个共享变量操作时,CAS是无法保证操作的原子性的。
Java从1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作。