决胜春招(六.附录1)——CAS解析

86 阅读1分钟

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操作。