CAS和自旋的区别

news2024/9/21 14:28:01

一、前言

       我们在面试的时候,经常性的会遇到一些关于锁的问题,尤其是面试官会提出问题:你对锁的了解多么?你知道锁的原理么?等等问题,于是也就会有后续延伸出来的:你知道CAS么?你知道什么是自旋么?

二、自旋

       自旋,顾名思义,可以理解为“自我旋转”,放到程序中就是“自我循环”,比如while循环或者for循环。结合者锁来理解的话就是:先获取一次锁,如果获取不到锁,会不停的循环获取,直到获取到。++不像普通锁那样,获取不到锁就进入阻塞状态++。

三、CAS

       CAS是什么?它的英文全程是Compare-And-Swap,中文叫“比较并交换”,它是一种思想、一种算法。
       CAS算法有3个基本操作数:

  • 内存地址V
  • 旧的预期值A
  • 要修改的新值B
           在并发情况下,各个代码的执行顺序不能确定,为了保证并发安全,哦我们可以使用普通的互斥锁,比如Java的synchronizedReentrantLock等。而CAS的特点就是避免使用互斥锁,当多个线程并发使用CAS更新同一个变量时,只有一个可以操作成功,其他都会失败;而且使用CAS更新失败的线程并不会阻塞,会快速失败并返回一个失败的状态,允许你再次尝试
           而CSA(Compare-And-Swap)时一种原子操作,用于实现多线程环境下的同步和并发控制。其基本原理如下:
  1. 读取内存值:首先,CAS会读取内存中的一个变量的当前值。
  2. 比较内存值和预期值:接下来,CAS会将读取的值与预期值进行比较,如果两者相等,则说明内存中的值并没有被其他线程修改。
  3. 如果相等,则将新值写入内存:在比较阶段,如果发现内存值与预期值相等,CAS会尝试将新值写入内存中。这个写入操作是原子的,即在这个过程中,不会被其他线程中断
  4. 如果写入成功,则操作完成;否则重复上述步骤:如果写入操作成功,CAS完成。如果写入操作失败,说明在比较和写入的过程中,内存值已经被其他线程修改,此时需要重新执行整个CAS操作。

可是使用下图来帮助理解:
       在上图中涉及到三个值的比较和操作:修改之前获取的(待修改)值A,业务逻辑计算的新值B,以及待修改值对应的内存位置的C。
       整个处理流程中,假设内存中存在一个变量i,它在内存中对应的值是A(第一次读取),此时经过业务处理之后,要把它更新成B,那么在更新之前会再读取一下i现在的值C,如果在业务处理的过程中i的值并没有发生变化,也就是A和C相同,才会把i更新(交换)为新值B。如果A和C不相同,那说明在业务计算时,i的值发生了变化,则不更新(交换)成B。最后,CPU会将旧的数值返回。而上述的一系列操作由CPU指令来保证是原子的。

       更简单点来说就是:如果我想更新一个变量A,那么我先把这个变量A记下来,等我处理了一些业务逻辑以后,准备更新这边变量了,我再读取一下这个变量A的值,比较一下,是否和之前读取的值相等 (验证在我处理业务的过程中是否被其他线程更改了),如果值相等,则更新变量A的值。(注意这里的描述:值相等)

image.png

       CAS的基本原理就是利用比较和写入的原子性操作来实现对共享变量的原子操作,从而避免了传统锁机制中的死锁和线程阻塞问题。

四、自旋锁和CAS的关系是什么呢?

       其实他们是两个不同的概念:

  1. 自旋是一种锁的优化机制:在锁优化中『自旋锁』指线程空转重试获取锁,避免线程上下文切换带来的开销。
  2. CAS是一种乐观锁机制,cas是通过比较并交换,失败的时候可以直接返回false而不用自旋的获取。只是在一般应用场景下,cas会带有重试机制(while或for实现空转,不断尝试获取)。

       若硬有关系,那可以这么理解:自旋锁 = 循环 + CAS

五、CSA的缺点

       我们都知道了这个自旋锁和 CAS 的关系了,那么CAS 都有哪些缺点呢?Compare-And-Swap (CAS) 的缺点包括:

  1. 自旋等待:CAS 在执行时会进行自旋等待,如果失败则需要重试,这会消耗处理器资源。
  2. ABA 问题:CAS 只能检测到共享变量的值是否发生了变化,但无法检测到变量的值是否经历了类似 A->B->A 的变化,这可能导致一些意外的问题。
  3. 无法保证公平性:CAS操作是非阻塞的,因此无法保证等待线程的公平性,可能导致某些线程长时间无法获取到执行机会。
  4. 无法解决死锁:CAS无法解决死锁问题,如果多个线程同事执行CAS操作,可能导致死锁的发生。
  5. 限制性: CAS操作通常只能应用于单个变量,对于复杂的数据结构,需要额外的处理来实现原子操作。

       总的来说,CAS 虽然具有高效的特点,但也存在着一些局限性和缺点。

       既然我们说了这个 CAS 那么面试官不可避免的就会问到,既然你了解了 CAS ,那么你是不是也对 ABA 问题有了解呢?

六、ABA问题

       还记得我们前文提到的“值相等”描述吗?如果在CAS处理业务期间,一个变量的值经理了以下变化:A–>B–>A 。那么CAS认为这个变量并没有发生变化,因为其读取到的结果是一样的,但是这个变量确实被其他线程修改过了。
       这就是CAS中著名的ABA问题,我们先来了了解一下什么叫ABA问题:

6.1 什么是ABA问题

       ABA问题是在分布式系统中常见的一种数据一致性问题。它的名称来源于三个操作:A(原始值)、B(第一个读取)、A(第二个读取)。ABA问题发生在一个线程T1读取了一个共享变量的值A,然后另一个线程T2修改了这个共享变量的值为B,然后又改回A,最后线程T1再次读取这个共享变量的值,发现仍然是A。在这种情况下,线程T1可能会错误地认为共享变量的值没有改变,从而导致数据不一致。

6.2 如何解决ABA问题

       解决ABA问题的常见方案是:使用版本号或者标记来跟踪数据的变化。通过在每次数据变化时增加版本号或者标记,可以避免ABA问题的发生,即:
       在类变量前追加上版本号,每次变量更新的时候把版本号+1,那么A-B-A就会变成1A-2B-3A
       另外,从Java1.5开始JDK的atomic包里提供的AtomicStampedReference类和AtomicMarkableReference类能够解决CAS的ABA问题

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

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

相关文章

Habitat环境学习二:导航任务中的Habitat-sim基础Habitat-sim Basics for Navigation

导航任务在Habitat-sim任务中的实现 官方教程概述重要概念1、Hello World程序1.0.1 基础设置Basic settings1.0.2 模拟器设置Configurations for the simulator1.0.3 创建模拟器实例1.0.4 初始化Agent1.0.5 导航和探索 官方教程 Habitat是一个高效的真实的3D模拟器&#xff0c…

基于C++的面向对象程序设计:类与对象的深入剖析

面向对象程序设计的基本特点 面向对象程序设计的基本特点包括:抽象、封装、继承、多态。 抽象 抽象是指对具体问题或对象进行概括,抽出其公共性质并加以描述的过程。一般情况抽象分为数据抽象和行为抽象,其中数据抽象是指一个对象区别于另…

idea/webstorm 创建Vue实例 Unresolved type Vue 处理方法

1.电脑本地安装node.js 官网下载 2. 其他: 未排除变量,前期试错(以下步骤配置了,但不确定对解决问题是否有帮助)

第 10 章:在C++中使用协程进行系统编程

最后一章专门介绍了一项对系统编程非常有用的功能,但这在C标准中相对较新。协程对象迅速找到了应用,成为了一等公民的状态机对象。它们的强大之处在于隐藏了协程帧后面的逻辑。请注意,这是一个高级主题,且C的协程接口既不简单也不…

216961-98-7,BODIPY 493/503 NHS 活化酯,可以应用于分子生物学等领域中

您好,欢迎来到新研之家 文章关键词:216961-98-7,BODIPY 493/503 NHS 活化酯,BODIPY 493/503 NHS ester,BODIPY 493/503 SE 一、基本信息 产品简介:BODIPY 493/503 NHS ester是一种特殊的染料&#xff0c…

【lesson4】高并发内存池ThreadCache(线程缓存)层实现

文章目录 ThreadCache层的结构申请内存逻辑释放内存逻辑自由链表的实现自由链表的成员变量自由链表的成员函数自由链表的完整实现 ThreadCache申请内存过程的实现ThreadCache需要的成员变量ThreadCache需要的成员函数ThreadCache.h文件代码Allocate的实现Deallocate的实现 封装…

02、全文检索 ------ Solr(企业级的开源的搜索引擎) 的下载、安装、Solr的Web图形界面介绍

目录 Solr 的下载和安装Solr的优势:Lucene与Solr 安装 Solr1、下载解压2、添加环境变量3、启动 Solr Solr 所支持的子命令:Solr 的 Core 和 Collection 介绍Solr 的Web控制台DashBoard(仪表盘)Logging(日志&#xff09…

理想架构的高回退Doherty功率放大器理论与ADS仿真-Multistage

理想架构的高回退Doherty功率放大器理论与仿真-Multistage 参考: 三路Doherty设计 01 射频基础知识–基础概念 Switchmode RF and Microwave Power Amplifiers、 理想架构的Doherty功率放大器(等分经典款)的理论与ADS电流源仿真参考&#x…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始,我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前,让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生(Cloud Native)是一个组合词,我们把它拆分为云和原生两个词来…

TS项目实战一:流淌的字符动画界面

使用ts实现虚拟世界,创建ts项目,并编写ts代码,使用tsc编译后直接加载到html界面,实现类似黑客帝国中的流淌的代码界面的效果。 源码下载地址:点击下载 讲解视频 TS实战项目一:数字流界面项目创建 TS实战项…

LRU缓存(Leetcode146)

例题: 分析: 题目要求函数get和put要达到O(1)的时间复杂度,可以用 hashMap 来实现,因为要满足逐出最久未使用的元素的一个效果,还需要配合一个双向链表来共同实现。链表中的节点为一组key-value。 我们可以用双向链表来…

前端工程化之:webpack1-9(plugin)

一、plugin loader 的功能定位是转换代码,而一些其他的操作难以使用 loader 完成,比如: 当 webpack 生成文件时,顺便多生成一个说明描述文件;当 webpack 编译启动时,控制台输出一句话表示 webpack 启动了&…

Gas Hero Common Heroes NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏,强调社交互动,并与 FSL 生态系统集成…

THREE.JS动态场景开发实战【赛博朋克】

在本教程中,我们将探索如何创建类似 Three.js 的赛博朋克场景,灵感来自 Pipe 网站上的背景动画。 我们将指导你完成使用 Three.js 编码动态场景的过程,包括后处理效果和动态光照,所有这些都不需要任何着色器专业知识。 我用这个场…

自动保存知乎上点赞的内容至本地

背景:知乎上常有非常精彩的回答/文章,必须要点赞收藏,日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到,即使之前保存了链接网络不好也打不开了(。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

文件上传的另类应用

1.Imagemagick CVE-2016-3714 CVE-2022-44268 CVE-2020-29599可在vulhub靶场进行复现1.1.Imagemagick简介 ImageMagic是一款图片处理工具,当传入一个恶意图片时,就有可能存在命令注入漏洞。 ImageMagick默认支持一种图片格式mvg,而mvg与svg…

USTC ICS(2023Fall) Lab2 The PingPong Sequence

LC-3汇编语言 .ORIG x3000LDI R0,n ;f(n)NOT R0,R0ADD R0,R0,#1 ;取R0补码用于减法AND R1,R1,#0 ;R1记录循环次数,先初始化为0ADD R2,R1,#0 ;R2记录符号,加号为0,减号为-1,f(1)对应加号ADD R3,R1,#3 ;记录f(n),f(1)3AND R5,R5,#0 ;R5存0000 1111 1111 1111…

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后,MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…

华为mate60 pro与小米14 pro 的巅峰对决

今天我们换下思路,不讲技术了!我们一起讲讲手机!小编暂时充当一下业余的数码咖。 今天我们就讲讲华为mate60 pro和小米14pro 这两款手机。这两款手机都是近期新出的发行版本,热度那是一直未减啊。 华为mate60 Pro 我们先说说这个…

gitlab-runner注册到gitlab时报错:ERROR: Registering runner... failed xxxxxxxx

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…