详谈CAS---以及ABA问题

什么是CAS?

比较并交换(Compared-And-Swap),它是一条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。

CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后边的那个线程没有抢到,所以期望值和主物理内存的值不一样,修改失败。

CAS底层原理

前面我们用到了这个方法(以原子的方法将当前值加1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的 源码合并到下面这一张图上,unsafe的底层实现原理是CAS原理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

假设当前对象的值为5,它的地址在var2里边,
在这里插入图片描述

当前对象的那个值如果比较成功了,加1,不成功继续执行while循环重新获取
在这里插入图片描述

总结:

比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止.
CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS缺点

1,循环时间长开销很大

在这里插入图片描述

2只能保证一个共享变量的原子操作

对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性

3会引出来ABA问题

在这里插入图片描述
原子引用
对某个类进行包装可以使用原子引用
在这里插入图片描述
在这里插入图片描述

ABA问题的解决
时间戳的原子引用
在这里插入图片描述
下边的两个线程是对于解决ABA问题的
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/delete_bug/article/details/119146907