CAS原理
CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首
先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值
假设有三个操作数:内存值V、旧的预期值E、要修改的值U。当且仅当预期值 E 和内存值 V 相同时,才会将内存值修改为 U 并返回 true,否则什么都不做并返回 false。当然 CAS 一定要 volatile 变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值 E 对某条线程来说,永远是一个不会变的值 E,只要某次 CAS 操作失败,永远都不可能成功
CAS问题
ABA问题
并发环境下,假设初始条件是 A,去修改数据时,发现是 A 就会执行修改。但是看到的虽然是 A,中间可能发生了 A 变 B,B 又变回 A 的情况。此时 A 已经非彼 A,数据即使成功修改,也可能有问题
解决方案:Java也提供了相应的原子引用类AtomicStampedReference<V>
reference即我们实际存储的变量,stamp是版本,每次修改可以通过+1保证版本唯一性。这样
就可以保证每次修改后的版本也会往上递增
循环时间长开销大
自旋CAS,如果一直循环执行,一直不成功,会给CPU带来非常大的执行开销
只能保证一个共享变量原子操作
CAS 保证的是对一个变量执行操作的原子性,如果对多个变量操作时,CAS 目前无法直接保证操作的原子性的