面试必问的CAS,你懂多少?
创始人
2024-05-24 07:14:21
0

目录

  • 一.什么是CAS?
  • 二.CAS实现过程
  • 三.CAS的缺点
    • 1.循环时间长
    • 2.只能保证一个共享变量是原子操作
    • 3.ABA问题和解决方法
  • 四.拓展题
    • 1.i++和++i是原子性操作吗?
    • 2. i++ 不加lock和synchronized怎么保证原子性?

一.什么是CAS?

CAS(Compare And Swap): 比较并替换,是一种无锁算法。在不使用锁的情况下实现多线程之间的变量同步。

V: 主存的值
E: 预期的值
N: 新值

二.CAS实现过程

注意:
① 在线程开启的时候,会从主存中给每个线程拷贝一个变量副本到本线程各自的运行环境中。
② 失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试。

并发环境: 执行 +1 操作,主存 V 初始值为 0,有两个线程 T1和T2。各自副本变量V1、V2为0,假设T1先拿到执行权

第一步: T1 读取当前 V1 的值赋值给 E1。
在这里插入图片描述

第二步: T1 执行 +1 操作,N1 = E1 + 1。
在这里插入图片描述

第三步: E1 和 主存 V比较,发现 E1 = V。
在这里插入图片描述

第四步: 将N1,写入主存,主存 V 变为 1。
在这里插入图片描述

第五步: T2拿到执行权,T2读取当前V2 的值赋值给 E2(这时V2还是0)。

在这里插入图片描述
第六步: T2 执行 +1 操作,N2 = E2 + 1。
在这里插入图片描述

第七步: E2 和 主存 V 比较,发现 E2 != V。
在这里插入图片描述

第八步: 重新获取 主存的值,V = 1,赋值给 V2,V2 赋值给E2。
在这里插入图片描述

第九步: T2 执行 +1 操作,N2 = E2 + 1。
在这里插入图片描述

第十步: E2 和 主存 V比较,发现 E2 = V。
在这里插入图片描述
第十一步: 将N2,写入主存,主存 V 变为 2。完成任务。
在这里插入图片描述

三.CAS的缺点

1.循环时间长

如果很多线程都去修改一个值,就会一直不成功一直尝试。

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

3.ABA问题和解决方法

原因: 线程1操作变量改为A,线程挂起,然后线程2操作变量改为X,又改为Z,最后改为A,其实中间变量的值已经被改变。
解决:
① 使用 AtomicStampReference 类,增加了一个标记 stamp,可以判断数据有没有被修改过。

public class AtomicStampedReference {private static class Pair {final T reference;final int stamp;private Pair(T reference, int stamp) {this.reference = reference;this.stamp = stamp;}static  Pair of(T reference, int stamp) {return new Pair(reference, stamp);}}

② 可以使用版本号,其实和上面stamp原理差不多。

四.拓展题

1.i++和++i是原子性操作吗?

不是原子性操作。不是一条单独的指令。是三条指令

第一步:获取这个值
第二步:+1
第三步:写回这个值

2. i++ 不加lock和synchronized怎么保证原子性?

有Atomic类里面有AtomicInteger类(底层是CAS)。

	//提供了硬件级别的原子操作,方法都是 native 修饰private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;public final boolean compareAndSet(int expect, int update) {//valueOffset=V,E=expect,N=updatereturn unsafe.compareAndSwapInt(this, valueOffset, expect, update);}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...