CAS(Compare And Swap比较并交换)
1.概念
cas非常重要!
CAS 操作包含三个操作数
- 内存位置(V)
- 预期原值(A)
- 新值(B)
CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。
整个J.U.C
都是建立在CAS之上的,因此对于synchronized
阻塞算法,J.U.C在性能上有了很大的提升。
cas存在的问题:
-
ABA问题
- 一个线程将共享变量从A改成B再改成A,另一个线程执行cas时会认为共享变量没被修改过.
- 解决方案:AtomicStampedReference(使用jdk1.5之后的带有时间戳的原子类)
-
循环时间长,cpu开销大
- 原因:cas使用for(;; )实现,不会使线程进入休眠状态,cpu会一直空转.
-
只能保证一个共享变量的原子操作
- 对多个共享变量操作时,循环CAS就无法保证操作的原子性
- 解决方法:(1)使用锁 (2)AtomicReference
2.cas实现
do…while实现