【Java|多线程与高并发】CAS以及ABA问题

news2025/1/22 14:56:40

文章目录

  • 1. 什么是CAS
  • 2. ABA问题
  • 3. ABA问题的解决

在这里插入图片描述

1. 什么是CAS

CAS(Compare and Swap,“比较和交换”)是一种并发编程中常用的原子操作,用于解决多线程环境下的数据竞争和并发访问问题。

CAS操作包含三个操作数:内存位置(通常是一个共享变量)、预期值和新值。它的执行过程如下:

  1. 读取内存位置的当前值。
  2. 比较当前值与预期值是否相等。
  3. 如果相等,则将内存位置的值更新为新值。
  4. 如果不相等,则说明有其他线程已经修改了内存位置的值,CAS操作失败。

CAS操作是由一条CPU指令,原子的完成的,是线程安全的且效率很高

使用场景:

  1. 实现原子类
  2. 实现自旋锁

原子类是为了解决多线程环境下的竞态条件(Race Condition)和数据不一致的问题。在多线程环境下,如果多个线程同时对一个共享变量进行读取和写入操作,可能会导致数据的不一致性,从而产生错误的结果。

自旋锁(Spinlock)是一种用于多线程同步的锁机制。它与传统的互斥锁(Mutex)不同,互斥锁在获取锁时,如果锁已经被其他线程占用,会将当前线程置于休眠状态,直到锁被释放。而自旋锁则是在获取锁时,如果锁已经被其他线程占用,当前线程会一直循环(自旋)等待,直到锁被释放

2. ABA问题

ABA问题指的是,在CAS操作期间,共享变量的值从A变为B,然后再从B又变回A,最后进行CAS操作的线程可能会错误地认为共享变量的值没有发生变化,从而导致操作的不正确。

如图所示:
在这里插入图片描述
正常情况下,即使是创建了两个线程去进行CAS操作修改余额,但第二个去执行CAS的线程会执行失败.并不会影响结果.
但在特殊情况中,因为CAS并不知道张三的余额到底是修改前的,还是修改后又变回来的. 因此张三就取了一次钱,但却被扣了两次余额. 这就是ABA带来的问题

3. ABA问题的解决

解决ABA问题的一种常见方法是使用带有版本号的CAS操作,也称为带有标记的CAS(CAS with Tag)。在这种方法中,除了共享变量的值外,还会维护一个版本号或标记。每次进行CAS操作时,不仅比较共享变量的值,还要比较版本号。如果共享变量的值和版本号都匹配,才执行CAS操作。

通过使用带有标记的CAS操作,可以避免ABA问题的发生。每次共享变量的值发生变化时,都会更新版本号,即使值从B又回到A,版本号也会发生变化,从而保证CAS操作的正确性。

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”

在这里插入图片描述

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

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

相关文章

【Git】 Git初相识

文章目录 1. Git的必要性1.1 提出问题1.2 解决问题1.3 注意事项 2. Git的安装2.1 kali下的安装2.3 Windows下的安装 3. Git的配置 1. Git的必要性 1.1 提出问题 在我们的学习或者工作中,经常会遇到一些比较难搞的上司或者老师,让我们交上去的文档改了又…

英伟达开发板学习系列---通过主机名称进行远程登录

1.前言 我们使用Jetson nx 的时候经常需要使用远程工具,而默认的网络配置IP地址采用动态分配,会造成IP地址不确定的问题,故我们可以设置hostname 唯一名字,通过hostname 进行远程连接。 2.通过主机名称进行登录 1.修改主机名称…

使用docker搭建mysql集群

一、技术架构 1、架构图 2、解说 mysql_1、mysql_2、mysql_3是一组主从模式,同理mysql_4、mysql_5、mysql_6也是一组主从模式从上面的图可以看出mysql_1和mysql_4是主节点,可以进行增删改查操作,但是子几点只能查询操作如果mysql_1节点出现问题了,有mysql_4节点组…

Python:使用prometheus-client提交数据到实现prometheus+ grafana数据监控

相关资料 prometheus文档:https://prometheus.io/grafana文档:https://grafana.com/grafana github: https://github.com/grafana/grafanaPyhton客户端https://pypi.org/project/prometheus-client/ 目录 1、使用Python提供数据源2、启动 prometheus3、…

eDNA暴露人类活动轨迹!你的DNA信息可能随时随地在泄露!

环境DNA(environmental DNA, eDNA)领域发展迅速,但人类eDNA的应用仍未得到充分利用和重视。eDNA分析的广泛应用将为病原体监测、生物多样性监测、濒危和入侵物种检测以及群体遗传学带来许多公认的好处。 佛罗里达大学野生动物疾病基因组学教…

【pytorch函数笔记】torch.sum()、torch.unsqueeze()

1.torch.sum torch.sum(imgs, dim0) # 按列求和 torch.sum(imgs, dim1) # 按行求和 imgs torch.Tensor([i for i in zip( range(10), range(10))]) print(imgs) s1torch.sum(imgs, dim0) # 按列求和 s2torch.sum(imgs, dim1) # 按行求和 print(s1) print(s2) 2.torch.uns…

在前端开发中使用 Python

推荐给需要鼓捣前端应用又不熟悉 JS 的 Pythoner 简介 在使用 Python 进行数据分析的时候,经常需要创建一些动态、交互式的可视化作品。一般会用到如 Plotly、Pyecharts、Bokeh 等库,这些库都是基于前端技术创建可视化作品。所以在自定义可视化的时候&a…

Python3,有了此库,不需要再为导包顺序而烦恼了,小刀拉屁股,涨知识了。

usort详解 1、引言2、代码实战2.1 usort 安装2.2 代码示例 3、总结 1、引言 小鱼:小屌丝,这段代码是你的写的不? 小屌丝:是我写的啊,咋 鱼哥 小鱼:你看你的导包顺序,挺乱的 小屌丝:…

一些共享资料

大家好,才是真的好。 我们好久没有分享资料了,上次分享还是上次——我也忘记了多久。 本次Engage2023开完之后,从会议上也流出了很多各类技术和主题方面的PPT、PDF资料等,我搜索了一些Domino技术话题有关的共享在这里。 主题涉…

算法----二叉树的最近公共祖先

题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它…

轻量服务器外网访问不了的原因分析

​  轻量服务器外网访问不了原因的分析。很多用户在选择轻量服务器的时候都没考虑,直接就购买了,导致在使用的时候遇见了很多问题,下面我们就简单的聊聊关于轻量服务器外网无法访问的原因。 这里我们按照标题的意思可以解读为两种情况&…

2023最新互联网公司时长排行榜出炉

今天给大家分享一个对于选择公司来说另一个非常重要的参考指标:“互联网时长”。 我们在选择一个公司的时候,除了需要关注总收入package 以外,还需要考虑这家公司的加班时长是否人性化。 我们的工作时长是周工作小时数。法定工作时间是40小…

这8种Python加速运行技巧真棒

关注“Python专栏”微信公众号,回复暗号【面试大全】,立即领取面试题简历模板。 Python 是一种脚本语言,相比 C/C 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象…

使用wpf做得计算器

最近在学习wpf,使用wpf做得计算器练手,实现功能增删改查,求平方根,倒数,取反,模拟实体计算器的M,MS,MC,MR功能 上面截图相关的计算为 8乘5加-2加3.2加(9除以3的余数)

一路乱飙,从手工测试进阶测试开发岗,“我“的测试之路不简单

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试人员的职能 …

StrSubstitutor和StrUtil占位符字符串替换

目录 一、commons-lang包下的StrSubstitutor1、使用场景一2、使用场景二 二、hutoo包下的StrUtil1、使用场景一2、使用场景二3、使用场景三 三、原生的三种方式 一、commons-lang包下的StrSubstitutor StrSubstitutor是commons-lang包提供的一个字符串替换类,整体使…

Redis实战——短信登录(二)

Redis代替session redis中设计key 在使用session时,每个用户都会有自己的session,这样虽然验证码的键都是“code”,但是相互不影响,从而确保每个用户获取到的验证码只能够自己使用,当使用redis时,redis的ke…

MCU单片机智能控制落地扇解决方案

随着科技进步和消费升级,消费者对电风扇的智能化需求日趋强烈。为了快速响应市场需求,以更低的成本打造智能电风扇。 MCU单片机智能控制落地扇解决方案以灵动微MM32SPIN040C主控。 方案采用的主控MM32SPIN040工作频率可达48MHz,内置16KB Fl…

虹科分享 | 拒绝自燃和爆炸,AGV电池如何进行实时监控和预测性维护?

Automated Guided Vehicle简称AGV,通常也称为AGV小车、自动导引运输车或无人搬运车等,指装备有电磁或光学等自动导引装置,能够沿规定的导引路径行驶,具有安全保护以及各种移载功能的运输车,通常用可充电的蓄电池来作为…

JumpServer开源堡垒机安装配置

JumpServer开源堡垒机安装与配置 一、简介二、下载与安装2.1、下载2.2、安装2.3、其他 一、简介 JumpServer 堡垒机帮助企业以更安全的方式管控和登录各种类型的资产。 支持 官网地址:https://www.jumpserver.org/index.html JumpServer 采用分层架构,…