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

news2024/12/24 3:51:18

目录

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.coloradmin.cn/o/882479.html

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

相关文章

【C++】做一个飞机空战小游戏(八)——生成敌方炮弹(rand()和srand()函数应用)

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

Iceberg 学习笔记

本博客对应于 B 站尚硅谷教学视频 尚硅谷数据湖Iceberg实战教程&#xff08;尚硅谷&Apache Iceberg官方联合推出&#xff09;&#xff0c;为视频对应笔记的相关整理。 1. Iceberg简介 1.1 概述 为了解决数据存储和计算引擎之间的适配的问题&#xff0c;Netflix 开发了 I…

【算法题】螺旋矩阵IV (求解n阶折线蛇形矩阵)

一、问题的提出 n阶折线蛇形矩阵的特点是按照图1所示的方式排列元素。n阶蛇形矩阵是指矩阵的大小为nn&#xff0c;其中n为正整数。 题目背景 一个 n 行 n 列的螺旋矩阵可由如图1所示的方法生成&#xff0c;观察图片&#xff0c;找出填数规律。填数规则为从 1 开始填到 nn。 …

如何使用AIGC人工智能辅助开发?

文章目录 引言AIGC辅助开发的应用场景代码生成图像识别与生成自然语言处理视频剪辑与生成 AIGC辅助开发的实现步骤数据准备模型选择模型训练结果评估与优化应用开发 AIGC辅助开发的优势与局限优势局限 未来展望总结 &#x1f389;欢迎来到AIGC人工智能专栏~如何使用AIGC人工智能…

计算机网络----CRC冗余码的运算

目录 1. 冗余码的介绍及原理2. CRC检验编码的例子3. 小练习 1. 冗余码的介绍及原理 冗余码是用于在数据链路层的通信链路和传输数据过程中可能会出错的一种检错编码方法&#xff08;检错码&#xff09;。原理&#xff1a;发送发把数据划分为组&#xff0c;设每组K个比特&#…

【Python】解决“Tk_GetPixmap: Error from CreateDIBSection”闪退问题

解决Python使用Tkinter的Notebook切换标签时出现的“Tk_GetPixmap: Error from CreateDIBSection 操作成功完成”闪退问题 零、问题描述 在使用Tkinter的Notebook控件时&#xff0c;对其标签进行切换&#xff0c;发现切换不了&#xff0c;一切换就报如下图错误&#xff1a; …

Python学习笔记_基础篇(五)_数据类型之字典

一.基本数据类型 整数&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一个tab键) 布尔值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的数据类型都存在想对…

3. 爬取自己CSDN博客列表(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络&#xff0c;清除历史消息按F5刷新页面找到接口&#xff08;community/home-api/v1/get-business-list&#xff09;接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

每天一道leetcode:646. 最长数对链(动态规划中等)

今日份题目&#xff1a; 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b] 后面…

JMeter 特殊组件-逻辑控制器与BeanShell PreProcessor 使用示例

文章目录 前言JMeter 特殊组件-逻辑控制器与BeanShell PreProcessor 使用示例1. 逻辑控制器使用1.1. While Controller 使用示例1.2. 如果&#xff08;If&#xff09;控制器 使用示例 2. BeanShell PreProcessor 使用示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞…

视频云存储平台EasyCVR视频汇聚接入AI算法接口,如何在检测中对视频流画框?

视频集中存储EasyCVR安防监控视频汇聚平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvif、海康Ehome…

Matlab中图例的位置(图例放在图的上方、下方、左方、右方、图外面)等

一、图例默认位置 默认的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圆 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直线 legend([A1,A2],圆形,line)二、通过Location对legend的位置进行改变 变…

国标GB28181视频平台EasyGBS国标视频平台接入大量通道,创建角色未响应的问题解决方案

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

生成IOS app专用密码教程

转载&#xff1a;生成IOS app专用密码教程 APP专用密码app-specific password是专门用于上传ipa文件的一种密码&#xff0c;是一种苹果的安全机制&#xff01; 现在苹果开发者账号开启了双重认证&#xff0c;提交ipa文件时候都需要这个密码&#xff01; 一.注册AppID账号 1…

Linux 路由三大件

对于 Linux 网络&#xff0c;好奇心强的同学一定思考过两个问题&#xff1a; 当我们发出一个包的时候&#xff0c;Linux 是如何决策该从哪个网卡&#xff08;假设有多个网卡&#xff09;、哪个下一跳发出这个包&#xff0c;用什么 IP 作为 source......当 Linux 收到一个包时&a…

云服务 Ubuntu 20.04 版本 使用 Nginx 部署静态网页

所需操作&#xff1a; 1.安装Nginx 2.修改配置文件 3.测试、重启 Nginx 4.内部修改防火墙 5.配置解析 6.测试是否部署成功 1.安装Nginx // 未使用 root 账号 apt-get update // 更新apt-get install nginx // 安装 nginx 1.1.测试是否安装没问题 在网页上输入云服务的公网…

链表之第一回

欢迎来到我的&#xff1a;世界 收录专栏&#xff1a;链表 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言第一题&#xff1a;删除链表的倒数第n个节点第二题&#xff1a;链表的中间结点第三题&#xff1a;合并两个排序…

Apache Dubbo 云原生可观测性的探索与实践

作者&#xff1a;宋小生 - 平安壹钱包中间件资深工程师 Dubbo3 可观测能力速览 Apache Dubbo3 在云原生可观测性方面完成重磅升级&#xff0c;使用 Dubbo3 最新版本&#xff0c;你只需要引入 dubbo-spring-boot-observability-starter 依赖&#xff0c;微服务集群即原生具备以…

Gradio部署应用到服务器不能正常访问

用Gradio部署一个基于ChatGLM-6B的应用&#xff0c;发布到团队的服务器上&#xff08;局域网&#xff0c;公网不能访问&#xff09;&#xff0c;我将gradio应用发布到服务器的9001端口 import gradio as gr with gr.Blocks() as demo:......demo.queue().launch(server_port90…

视频集中存储安防监控平台EasyCVR优化AI硬件接入时的通道显示异常问题

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…