CAS问题汇总

news2024/10/7 14:33:51

CAS的执行流程?

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

  1.  首先它有三个参数 : V 内存值 A 预期的旧值 B 新值
  2. 比较V的值与A的值是否相等
  3. 如果相等的话,则将V的值替换成B,否则就提示修改失败。

一般正常情况的话就是没有其他线程修改内存值:

特殊情况就是会有其他线程干扰修改值:

 

 

CAS中的ABA问题?

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

【举个生活中的例子】

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

【1】正常情况下,没有其他人给我转账的时候

第一次CAS:

  • A 旧值 200
  • B 新值 100
  • V 内存值 200
  • 比较V和A的值
  • 相等 张三 -100 李四+100
  • 扣款成功

第二次CAS:

  • A 旧值 200
  • B 新值 100
  • V 内存值 100
  • 比较V和A的值
  • 不相等 不进行扣款操作
  • 扣款失败 张三余额 100 元

【2】 ABA情况,转账途中有第三方介入

第一次CAS:

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

在第二次CAS之前,此时张三的哥们刚好还了张三100元,此时V内存值被改成了200,此时张三的余额又变成了200

第二次CAS:

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

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

如何解决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,这才是合理的。

CAS在Java中的实现类有哪些?

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

【面试问题】

① 此时面试官可能会问: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/886657.html

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

相关文章

解决内网GitLab 社区版 15.11.13项目拉取失败

问题描述 GitLab 社区版 发布不久&#xff0c;搭建在内网拉取项目报错&#xff0c;可能提示 unable to access https://github.comxxxxxxxxxxx: Failed to connect to xxxxxxxxxxxxxGit clone error - Invalid argument error:14077438:SSL routines:SSL23_GET_S 15.11.13ht…

工业互联网产业联盟发布《2023可信工业数据流通应用案例集》

导读 随着新一代信息技术与制造业的深度融合发展&#xff0c;全球工业数据应用已经进入纵深发展的新阶段&#xff0c;数据作为新型生产要素和重要战略资源&#xff0c;正在制造业数字化转型过程中发挥出更大的作用。在这一进程中&#xff0c;工业数据的流通共享受到广泛关注。…

深入探索JavaEE单体架构、微服务架构与云原生架构

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取码: 4s99 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; &#x1f50d;【00】模块零&#xff1a;开营直播&a…

LeetCode集

目录 1、算法1.1 排序1.1.1 冒泡排序1.1.1.1 简单交换排序1.1.1.2 冒泡排序 1.1.2 简单选择排序1.1.3 直接插入排序1.1.4 希尔排序1.1.5 堆排序1.1.6 归并排序1.1.7 快速排序 1.1 位运算/二进制1.1.1 Java中的正数、负数1.1.2 Java中的位运算1.1.3 比特位计数1.1.4 2的幂1.1.5 …

【腾讯云Cloud Studio实战训练营】Cloud Studio + iPad,让代码之舞飞扬在指尖

Cloud Studio iPad&#xff0c;让代码之舞飞扬在指尖 妙手偶得&#xff0c;开启神奇之旅立即反馈&#xff0c;一切尽在掌握版本控制&#xff0c;简单易用MetaWork 协作&#xff0c;摸鱼变得不再轻松 ​一直以来&#xff0c;开发者大多都习惯在电脑端开发&#xff0c;而iPad只是…

Swift 基础

工程目录 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 点击下载代码&#xff1a;swift-01

windows 删除桌面右键菜单多余项

Step1&#xff1a;打开注册表 winr输入 regedit Step2&#xff1a;输入以下路径&#xff0c;跳转到相应位置 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell 即可查看当前所有的右键选项&#xff0c;如下图所示 Step3&#xff1a;删除不需要的选项 直接删掉相应的文…

javaScript:数组检测

目录 一.前言 二.数组检测方法 1.every&#xff08;&#xff09; 2.some&#xff08;&#xff09; 3.filter&#xff08;&#xff09; 一.前言 数组检测是指在编程中对数组进行验证和检查的过程。数组检测可以涉及以下方面&#xff1a; 确定数组的存在&#xff1a;在使用数…

NLP中的RNN、Seq2Seq与attention注意力机制

目录 NLP自然语言处理 的RNN、Seq2Seq与attention注意力机制 RNN循环神经网络 前馈网络入门 前馈网络 循环网络 多层感知器架构示例 循环神经网络的运作原理 展开 RNN seq2seq模型 Attention&#xff08;注意力机制&#xff09; 总结 引用 NLP自然语言处理 的RNN、…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

2023年备受欢迎的5款团队任务管理工具

任务管理是团队协作的重要环节&#xff0c;选择合适的团队任务管理软件可以提高工作效率、明确责任分工、加强沟通协作。在互联网领域&#xff0c;有许多好用的团队任务管理软件可供选择。下面介绍5款比较知名的团队任务管理软件&#xff0c;并从互联网场景的相关背景内容上进行…

懵了,面试官问我Redis怎么测,直接凉了...

前言 有些朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测…

JavaEE初阶:多线程 - Thread 类的基本用法

上次我们了解了多线程的五种创建方法&#xff0c;今天来学习Thread的基本用法。 目录 run和start Thread常见的构造方法 Thread的几个常见属性 后台线程 是否存活 线程终止 1.使用标志位 2.使用Thread自带的标志 等待线程 run和start 首先需要理解Thread的run和star…

小程序商品如何设置指定的配送规则

小程序配送规则包括商品是否包邮、包邮金额、起总金额、计费方式、配送区域等&#xff0c;这些规则直接影响到商家的运营和用户的购物体验。下面将详细介绍如何给商品设置配送规则。 1. 添加配送规则。商家在配送设置->配送规则&#xff0c;添加配送规则。配送规则支持的功…

openpnp - 做一个抛料盒

文章目录 openpnp - 做一个抛料盒概述效果图零件 - 抛料盒主体零件 - 磁铁仓盖板END openpnp - 做一个抛料盒 概述 8mm散料飞达做回来了, 上面用的长方形磁铁(4x6x10mm)透过0.8mm的3D打印薄壁, 和固定铁板的吸力很大, 用磁力固定的非常好. 正好缺一个抛料盒, 就按照散料飞达的…

Vue中拖动排序功能,引入SortableJs,前端拖动排序。

背景&#xff1a; 作为一名前端开发人员&#xff0c;在工作中难免会遇到拖拽功能&#xff0c;分享一个github上一个不错的拖拽js库&#xff0c;能满足我们在项目开发中的需要&#xff0c;支持Vue和React&#xff0c;下面是我在vue后台项目中中使用SortableJS的使用详细流程&am…

现代C++:使用 shared_from_this 防止 this 提前被释放

首先概括一下shared_from_this的作用&#xff1a;可以在类的成员函数中直接通过this得到指向当前所在对象的shared_ptr的智能指针&#xff0c;具体操作如下。 使用方法 设需要提供shared_from_this方法的类为C0定义为类&#xff0c;首先需要将C0定义为 std::enable_shared_fr…

NCAA棒球介绍·棒球1号位

NCAA棒球介绍 1. NCAA简介 NCAA&#xff08;National Collegiate Athletic Association&#xff09;的历史与发展 NCAA&#xff0c;这个拥有94年悠久历史的体育联盟&#xff0c;从一所校际体育比赛&#xff0c;发展成为世界上最大的大学体育组织&#xff0c;NCAA的发展历程充…

.NET Core发布到IIS

项目介绍 1、开发工具Visual Studio 2017&#xff0c;语言C#&#xff0c;SQL SERVER&#xff0c;WIN10 2、本地IIS&#xff0c;手机上或其他用户在和本地在同一个局域网内访问,同时要把防火墙关掉 3、IIS全名Internet Information Services&#xff0c;用来发布网站 先决条件 安…