CAS 的执行流程 ?CAS 中 ABA 问题如何解决 ?CAS 在 Java 中有哪些实现类 ?

目录

1. CAS 的执行流程

2. CAS 中的 ABA 问题

3. 如何解决 CAS 中的 ABA 问题

4.CAS 在Java 中的实现类有哪些


1. CAS 的执行流程

CAS 比较并替换的大致流程是这样的:

  • 它有三个操作单位:V(内存值),A(预期的旧值),B(新值),
  • 比较 V 的值和 A 的值是否相等,
  • 如果相等的话,则将 V 的值替换成 B,否则就提示用户修改失败。

正常情况(没有其他线程修改内存值):

 特殊情况(有其他线程干扰修改值):

2. CAS 中的 ABA 问题

        什么是 ABA 问题呢 ? 对于上图中的有其他线程修改内存值的情况,当线程 1 在执行 CAS 之前,如果有两个线程过来修改内存中的值了:线程 2 将原来的值给修改了,线程 3 又把内存的值给改回来了,这个时候线程 1 再去执行 CAS 就会出问题,这个就是 ABA 问题。

【举个例子

比如说张三原来账上有 200 元,此时张三需要给李四转账 100 元,如果在转账的时候不小心点了两次提交,那么此时就会执行两次 CAS。

① 正常情况下,没有其他人给我转账的时候 >>

第一次 CAS :

  • A(旧值):200
  • B(新值):100
  • V(内存值):200
  1. 比较 V 和 A 的值
  2. 相等,张三 - 100 元,李四 + 100 元
  3. 扣款成功(张三余额 100 元)

第二次 CAS:

  • A(旧值):200
  • B(新值):100
  • V(内存值):100
  1. 比较 V 和 A 的值
  2. 不相等,不能进行扣款操作
  3. 扣款失败(张三余额 100 元)

② ABA 情况,转账途中有第三方介入 >>

第一次 CAS :

  • A(旧值):200
  • B(新值):100
  • V(内存值):200
  1. 比较 V 和 A 的值
  2. 相等,张三 - 100 元,李四 + 100 元
  3. 扣款成功(张三余额 100 元)

在第二次 CAS 之前,此时张三的哥们王五刚好还了张三 100 元,此时 V(内存值)被改为了 200,也就是说张三此时账上的余额又变回了 200。

第二次 CAS:

  • A(旧值):200
  • B(新值):100
  • V(内存值):200
  1. 比较 V 和 A 的值
  2. 相等,张三 - 100 元,李四 + 100 元
  3. 扣款成功(张三余额 100 元)

上述有第三方介入的情况,原本张三在转账 100 元之后,账户上应该还剩 20 元的,最终却只剩 100 元了,这就是 CAS 的 ABA 问题。

3. 如何解决 CAS 中的 ABA 问题

常见的办法就是引入版本号(version)!!

还是上述转账的例子,只不过这次给每个线程的操作都加上新的版本号:

① 线程一(张三):获取原内存值 200_version_1 ,比较 V 和 A,相等,扣款成功,然后将内存值修改为 100_version_2。

② 线程三(王五):获取原内存值 100_version_2,比较 V 和 A,相等,转账成功,然后将内存值修改为 200_version_3。

③ 线程二(张三):获取原内存值 200_version_3,比较 V 和 A(200_version_1),不相等,扣款失败,退出修改。

此时张三账户上余额为 200,这才是合理的。

4.CAS 在Java 中的实现类有哪些

Java 中提供的 AtomicXXX 类,都是 CAS 的具体实现。例如:AtomicInteger,AtomicLong 等等。

AtomicInteger 的底层源码:

【面试问题】

① 此时面试官可能会问:Java 提供的 AtomicInteger 是否存在 ABA 问题 ??

答案是存在!!因为 AtomicInteger 没有引入版本号。

② 面试官接着问:那如何解决 AtomicInteger 的 ABA 问题 ??

使用 Atomic 家族的 AtomicStampedReference 类,它在使用的时候,必须指定一个版本号,并且它的对象在调用 CAS 的方法时,它需要设置 4 个参数,分别是:

  • 旧值 A
  • 新值 B
  • 当前版本
  • 执行修改后的版本号

所以使用这个类可以解决 ABA 问题。

AtomicStampedReference<Integer> as = new AtomicStampedReference<>(100,1);
as.compareAndSet(200,100,1,2); // 旧值,新值,当前版本号,修改后的版本号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D沉浸式旅游网站开发案例复盘【Three.js】

Plongez dans Lyon网站终于上线了。 我们与 Danka 团队和 Nico Icecream 共同努力&#xff0c;打造了一个令我们特别自豪的流畅的沉浸式网站。 这个网站是专为 ONLYON Tourism 和会议而建&#xff0c;旨在展示里昂最具标志性的活动场所。观看简短的介绍视频后&#xff0c;用户…

Android 面试笔记整理-Binder机制

作者&#xff1a;浪人笔记 面试可能会问到的问题 从IPC的方式问到Binder的优势为什么zygote跟其他服务进程的通讯不使用BinderBinder线程池和Binder机制 等等这些问题都是基于你对Binder的理解还有对其他IPC通讯的理解 IPC方式有多少种 传统的IPC方式有Socket、共享内存、管道…

云计算虚拟仿真实训平台

一、云计算虚拟仿真系统概述 云计算虚拟仿真系统是一种基于云计算技术和虚拟化技术的系统&#xff0c;用于实现各种仿真和模拟任务。它可以提供强大的计算能力和资源管理&#xff0c;为用户提供灵活、高效、可扩展的仿真环境。 该系统通常由一组服务器、网络和存储设备组成&am…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果&#xff1a; 如下图所示&#xff0c;进入该页面后&#xff0c;默认选中第一个分类&#xff0c;以及第一个分类下的列表数据。 二、代码实现&#xff1a; 关键代码&#xff1a; 进入页面时&#xff0c;默认调用分类的接口&#xff0c;在分类接口里做判断&#xff…

神经网络基础-神经网络补充概念-08-逻辑回归中的梯度下降算法

概念 逻辑回归是一种用于分类问题的机器学习算法&#xff0c;而梯度下降是优化算法&#xff0c;用于更新模型参数以最小化损失函数。在逻辑回归中&#xff0c;我们使用梯度下降算法来找到最优的模型参数&#xff0c;使得逻辑回归模型能够更好地拟合训练数据。 逻辑回归中的梯…

无监督学习之主成分分析-半导体制造高维数据如何降维

数据降维不只存在于半导体数据中&#xff0c;它是存在于各行各业的&#xff0c;我们要分析的数据维数较多的时候全部输入维数较大这时就要采取降维的方法综合出主要的几列用于我们的分析。 PCA的哲学理念是要抓住问题的主要矛盾进行分析&#xff0c;是将多指标转化为少数几个…

前端技术栈es6+promise

let入门使用、 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>let 基本使用</title><script type"text/javascript">let name "hspedu教育";//老韩解读//1. conso…

苹果Mac像Windows一样使用

一、将磁盘访问设置的像Windows一样&#xff1a; 1.1、点击任务栏第一个按钮打开“访达”&#xff0c;点击菜单栏上的访达-偏好设置&#xff1a; 1.2、勾选“硬盘”&#xff0c;这样macOS的桌面上就会显示一个本地磁盘&#xff0c;之后重命名为磁盘根&#xff0c;相当于window…

SPF9139全力适配ios16与鸿蒙3.0,超实用数据提取、分析、恢复能力UP!

​ 如今&#xff0c;群聊已成为人们必不可少的沟通窗口 家人群&#xff0c;好友群&#xff0c;班级群 粉丝群&#xff0c;交友群&#xff0c;工作群 …… 各类群聊铺天盖地般涌来的同时 也有一些群聊沦为了 赌博、传播淫秽视频、发表不当言论 等违法犯罪行为滋生之地 与…

mac 可以进行单片机(stm32)的开发吗?

当涉及到在Mac上进行单片机开发时&#xff0c;是完全可行的。以下是为什么Mac适合单片机开发的解释&#xff1a;开发工具&#xff1a;针对STM32单片机&#xff0c;你可以使用多种开发工具。一个常用的选择是Segger Embedded Studio&#xff0c;它是一个功能强大的集成开发环境&…

ClickHouse(十八):Clickhouse Integration系列表引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

Java并发编程(六)线程池[Executor体系]

概述 在处理大量任务时,重复利用线程可以提高程序执行效率,因此线程池应运而生。 它是一种重用线程的机制,可以有效降低内存资源消耗提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行线程池可以帮助我们更好地管理线程的生命周期和资源使用,…

Jmeter - 函数助手

目录 __StringFromFile __CSVRead __counter __RandomString __StringFromFile StringFromFile函数用于获取文本文件的值&#xff0c;一次读取一行 1、输入文件的全路径&#xff1a;填入文件路径 2、存储结果的变量名&#xff08;可选&#xff09; 3、Start file sequence …

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求&#xff1a;请求行请求头请求体HTTP响应&#xff1a;响应行&#xff08;状态行&#xff09;响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…

游戏中的UI适配

引用参考&#xff1a;感谢GPT UI适配原理以及常用方案 游戏UI适配是确保游戏界面在不同设备上以不同的分辨率、屏幕比例和方向下正常显示的关键任务。下面是一些常见的游戏UI适配方案&#xff1a; 1.分辨率无关像素&#xff08;Resolution-Independent Pixels&#xff09;&a…

【广州华锐视点】VR警务教育实训系统模拟真实场景进行实践训练

随着科技的发展&#xff0c;虚拟现实技术在教育领域得到了广泛的应用。VR警务教育实训系统就是其中的一种应用&#xff0c;该系统由广州华锐互动开发&#xff0c;可以模拟真实的警务场景&#xff0c;让学生通过虚拟现实技术进行实践训练&#xff0c;提高学生的实践能力和技能水…

Linux:shell脚本循环语句

目录 一、循环含义 二、echo命令 三、for 3.1.将1到100累加求和 3.2批量添加用户 3.3 根据IP地址检查主机状态 四、 while 和 until 4.1 猜价格 4.2 1-100求和 一、循环含义 循环含义 将某代码段重复运行多次&#xff0c;通常有进入循环的条件和退出循环的条件 重复…