前言
cas,即 compare and swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过cas来实现了乐观锁。
cas算法过程
算法涉及到三个操作数:
- 需要读写的内存位置v
- 需要进行比较的预期值a
- 需要写入的新值u
cas算法解析:
cas具体执行时,当且仅当预期值a符合内存地址v中存储的值时,就用新值u替换掉旧值,并写入到内存地址v中。否则不做更新。
cas算法的运行原理如下如所示:
cas会有如下三个方面的问题:
1.aba问题,一个线程将内存值从a改为b,另一个线程又从b改回到a。
2.循环时间长开销大:cas算法需要不断地自旋来读取最新的内存值,长时间读取不到就会造成不必要的cpu开销。
只能保证一个共享变量的原子操作(jdk的atomicreference来保证应用对象之间的原子性,可以把多个变量放在一个对象里来进行cas操作,解决了这一问题)。
aba问题图解:
aba问题ag真人游戏的解决方案:在变量前面添加版本号,每次变量更新的时候都将版本号加1,比如juc的原子包中的atomicstampedreference类。