CAS的ABA问题

目录

什么是 CAS

CAS最主要的用途,实现原子类

基于CAS实现自旋锁

CAS的一个典型缺陷,ABA问题

解决 ABA 问题的方法


什么是 CAS
CAS: 全称Compare and swap,字⾯意思:”⽐较并交换“,⼀个 CAS 涉及到以下操作:
我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。
1. ⽐较 A 与 V 是否相等。(⽐较)
2. 如果⽐较相等,将 B 写⼊ V。(交换)
3. 返回操作是否成功。
判定内存中的值和寄存器1的值是否一致
如果一致,就把内存中的值和寄存器2进行交换
但是只关心交换后内存中的值,不关心寄存器2的值
此处可以把这样的操作理解成赋值
本质上是交换,基于交换实现了赋值

CAS是cpu的一条指令,原子

操作系统就会把这个指令进行封装,提供一些api,就可以在c++zhong被调用

jvm又是基于c++实现的,jvm也能够使用c++调用这样的CAS操作


CAS最主要的用途,实现原子类

boolean,int,long这些类型进行了封装

count++线程不安全

就需要加锁来解决问题

但是认为加锁效率比较低

于是通过cas来实现count++

确保性能同时保证线程安全

使用原子类的目的,就是为了避免加锁

标准库中提供了 java.util.concurrent.atomic 包, ⾥⾯的类都是基于这种⽅式来实现的.
典型的就是 AtomicInteger 类. 其中的 getAndIncrement 相当于 i++ 操作.
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicExample {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        // 原子地增加计数器
        int newValue = counter.incrementAndGet();
        System.out.println("New Value: " + newValue);

        // 原子地减少计数器
        int oldValue = counter.getAndDecrement();
        System.out.println("Old Value: " + oldValue);

        // 使用 compareAndSet
        boolean success = counter.compareAndSet(0, 10);
        System.out.println("CompareAndSet Result: " + success + ", Current Value: " + counter.get());
    }
}

基于CAS实现自旋锁
基于 CAS 实现更灵活的锁, 获取到更多的控制权.
⾃旋锁伪代码
public class SpinLock {
   private Thread owner = null;

   public void lock(){
     // 通过 CAS 看当前锁是否被某个线程持有. 
     // 如果这个锁已经被别的线程持有, 那么就⾃旋等待. 
     // 如果这个锁没有被别的线程持有, 那么就把 owner 设为当前尝试加锁的线程. 
     while(!CAS(this.owner, null, Thread.currentThread())){
     }
   }

   public void unlock (){
      this.owner = null;
   }
}

加锁操作就需要判定锁是否被人占用

如果未被人占用就把当前线程的引用设置到owner中

如果已经被人占用就等待

这里就开始自旋

发现锁已经被占用cas不会执行交换返回false

进入循环,再进行下一次判定

由于循环是空着的,整个循环速度非常快(忙等)

但是一旦其他线程释放了锁,此时该线程就能第一时间拿到这里的锁


CAS的一个典型缺陷,ABA问题

使用cas能够进行线程安全的编程的核心就是先比较相等,内存和寄存器是否相等

这里本质上在进行判定是否有其他线程插进来做了一些修改

认为如果发现这里寄存器和内存值一致,就可以认为是没有线程穿插

过来修改,因此接下来的修改操作就是线程安全的

本来判定内存的值是否是A发现果然是A,说明没有其他线程修改过

但实际上,可能存在一种情况,另一个线程把内存从A修改成B又从B修改回A

ABA 问题示例

假设有一个共享变量 x,初始值为 A。线程 1 希望将 xA 更新为 C,但在执行 CAS 操作之前,线程 2 将 xA 更新为 B,然后又将 xB 更新回 A。此时,线程 1 执行 CAS 操作,发现 x 的值仍然是 A,于是成功地将 x 更新为 C。尽管 x 的值在中间发生了变化,但 CAS 操作无法检测到这种变化。


解决 ABA 问题的方法

如果换成其他的指标,约定,只能加,不能减,有效避免aba问题

例如,引入另一个概念“版本号”

整数,每次修改一次,版本号就+1

int oldVersion = version;

if(CAS(version,oldVersion,oldVersion+1){

 balance -=50;

}

Java 提供了两种方法来解决 ABA 问题:

  1. AtomicStampedReference:使用一个时间戳(或版本号)来标记引用,每次更新时同时更新时间戳。这样,即使值从 A 变为 B 再变回 A,时间戳也会发生变化,从而避免 ABA 问题。

  2. AtomicMarkableReference:使用一个布尔值来标记引用,类似于时间戳,但更简单。适用于只需要简单标记的情况

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili (一)简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

基于SSM+小程序的童装商城管理系统(商城3)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的童装商城管理系统实现了管理员及用户。 1、管理员实现了 首页、个人中心、用户管理、分类列表管理、童装商城管理、系统管理、订单管理。 2、用户实现了 注册、登录、首…

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%

海达光能终止原因如下:报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上,公司毛利率更是远低于行业龙头福莱特,恐难以说明公司行业代表性。在企业竞争上,公司2021年度的市场占有率约为2.35%,公司未来光伏玻…

丁子晴作品《指尖的爱的温度》荣获“金犊奖”全球最佳新锐奖

第33届时报金犊奖颁奖盛典于10月18日在中国成都西部智谷数字体验中心隆重举行。丁子晴的作品《指尖的爱的温度》在激烈的竞争中脱颖而出,荣获了第33届“金犊奖”全球最佳新锐奖。享有盛誉的“金犊奖”是一个全球性的奖项,以其专业严谨、创意水平高的特点,被业界誉为“青年创意的…

kaggle 数据集下载

文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…

vue2项目在发布后更新,提示用户刷新页面

1、在项目根目录创建resetVersion.js的文件,内容如下 (具体路径可能会有点问题,但是不影响) const path require(path); const fsExtra require(fs-extra);const runBuild async () > {try {const OUTPUT_DIR public; // …

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图(图2.2.1-1) 2.2.2 系统功能表(表2.2.2…

MySQL用户权限管理属于SQL语句中的DCL语句

1.用户授权 语法:grant 权限,权限,on 库名,表名 to 用户名 [identified by 密码] MySQL5的版本,如果这个用户事先不存在,这个grant命令去给用户授权的时候,会将用户一起创建出来&#xff0…

时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节|征文# 在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具…

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中,企业的业务流程高度依赖于数据的准确性和完整性。然而,数据失真问题却如同隐匿在流程中的“暗礁”,频繁地给企业的业务流程顺畅度带来严重挑战,进而影响企业的整体运营效率和竞争力。 数据失真的表…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统,包含以下核心模块: 1、数据爬取:通过request请求获取猎聘网的就业数据。 2、数据存储和分析:使用 Hive …

GB/T 28046.1-2011 道路车辆 电气及电子设备的环境条件和试验 第1部分:一般规定(2)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识,希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 第1部分:一般规定 7. 试验和要…

GetMaterialApp组件的用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

自适应阻抗案例分析(上)

案例分析一 Duchaine,V.,Gosselin,C.(2009).Safe,stable and intuitive control for physical human-robot interaction.In IEEE international conference on robotics and automation,2009.ICRA09(pp.3383-3388).IEEE. 主要贡献 1.利用外力反馈调整阻尼系数,同…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将某些步骤…

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言:上一篇实现了角色简单的移动控制,但是实际游戏中玩家的视角是可以转动的,并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动,觉得有帮助的话可以点赞收藏支持一下! 玩家第一人称视角 修复小问…

arco-design 自定义table和for循环自定义form-item并添加自定义校验

代码 <template><div class"list-container"><Breadcrumb:items"[menu.generateRecords, menu.generateRecordsDetail]":needBack"true"/><a-card class"general-card"><PageQueryref"pageQuery&quo…

DriftingBlues: 1渗透测试

靶机&#xff1a;DriftingBlues: 1 DriftingBlues: 1 ~ VulnHubhttps://www.vulnhub.com/entry/driftingblues-1,625/ 攻击机&#xff1a;kail linux 2024 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现靶机 靶机I…

一个简单的图像分类项目(四)编写脚本:图像加载器

创建训练和测试的数据集&#xff0c;并创建加载器。lib.load_imags.py: import glob from torch.utils.data import DataLoader, Dataset from torchvision import transformsfrom script.setting import *# 图片处理函数 def img_loader(path):try:img Image.open(path)img …

NLTK无法下载?

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 nltk无法下载怎么办&#xff1f;什么是NLTK&#xff1f;为什么要用NLTK&#xff1f;如何下载&#xff1f; nltk无法下载怎么办&#xff1f; 什么是NLTK&#xff1f; NLTK是学习自然…