当前位置: 首页 > news >正文

一文理解CAS和自旋的区别(荣耀典藏版)

 

目录

一、自旋

二、CAS

三、什么是 ABA 问题


 大家好,我是月夜枫,通常在面试的时候,或者在学习的时候,经常性的会遇到一些关于锁的问题,尤其是面试官会提出提问,你对锁了解的多么?你知道锁的原理么?等等问题,于是也就会有后续延伸出来的,你知道 CAS 么?你知道什么是自旋么?今天就分析其中的CAS和自旋的区别。

 

一、自旋

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

二、CAS

CAS 是什么,它的英文全称是 Compare-And-Swap,中文叫做“比较并交换”,它是一种思想、一种算法。

CAS算法有3个基本操作数:

  • 内存地址V

  • 旧的预期值A

  • 要修改的新值B

在并发场景下,各个代码的执行顺序不能确定,为了保证并发安全,我们可以使用普通的互斥锁,比如Java的 synchronized, ReentrantLock等。而CAS的特点是避免使用互斥锁,当多个线程并发使用CAS更新同一个变量时,只有一个可以操作成功,其他都会失败。而且用CAS更新失败的线程并不会阻塞,会快速失败并返回一个失败的状态,允许你再次尝试。

而Compare-And-Swap(CAS)是一种原子操作,用于实现多线程环境下的同步和并发控制。其基本原理如下:

  1. 读取内存值:首先,CAS会读取内存中的一个变量的当前值。

  2. 比较内存值和预期值:接下来,CAS会将读取的值与预期值进行比较。如果两者相等,则说明内存中的值没有被其他线程修改。

  3. 如果相等,则将新值写入内存:在比较阶段,如果发现内存值与预期值相等,CAS会尝试将新值写入内存中。这个写入操作是原子的,即在这个过程中不会被其他线程中断。

  4. 如果写入成功,则操作完成;否则重复上述步骤:如果写入操作成功,CAS完成。如果写入操作失败,说明在比较和写入的过程中,内存值已经被其他线程修改,此时需要重新执行整个CAS操作。

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

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

其实他们是两个不同的概念 自旋是一种锁优化的机制,在锁优化中『自旋锁』指线程空转重试获取锁,避免线程上下文切换带来的开销。

CAS是一种乐观锁机制,cas是通过比较并交换,失败的时候可以直接返回false不用自旋的获取。只是一般应用场景下,cas都会带有重试机制(while或者for实现空转,不断尝试获取)。

如果硬有关系,那么可以这样理解

自旋锁 = 循环+CAS

我们都知道了这个自旋锁和 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 问题

我们先来看什么是 ABA 的问题。

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

解决ABA问题的常见方案是使用版本号或者标记来跟踪数据的变化。通过在每次数据变化时增加版本号或者标记,可以避免ABA问题的发生。另外,使用CAS(Compare and Swap)操作也可以解决ABA问题,CAS操作会在更新变量时检查变量的值是否仍然是预期值,从而避免了ABA问题的发生。

简单的说就是

比如线程1从内存位置V中取出A,此时线程2也取出A。且线程2做了一次cas将值改为了B,然后又做了一次cas将值改回了A。此时线程1做cas发现内存中还是A,则线程1操作成功。这个时候实际上A值已经被其他线程改变过,这与设计思想是不符合的。

那么这个问题出现在哪里呢?

  • 如果只在乎结果,ABA不介意B的存在, 没什么问题

  • 如果B的存在会造成影响,需要通过 AtomicStampReference,加时间戳解 决。

那关于自旋和 CAS  你了解了么?

相关文章:

一文理解CAS和自旋的区别(荣耀典藏版)

目录 一、自旋 二、CAS 三、什么是 ABA 问题 大家好,我是月夜枫,通常在面试的时候,或者在学习的时候,经常性的会遇到一些关于锁的问题,尤其是面试官会提出提问,你对锁了解的多么?你知道锁的原…...

【吊打面试官系列】Java虚拟机JVM篇 - 关于内存溢出

大家好,我是锋哥。今天分享关于内存溢出的JVM面试题,希望对大家有帮助; 什么是内存溢出? 内存溢出(OOM)是指可用内存不足。程序运行需要使用的内存超出最大可用值,如果不进行处理就会影响到其他…...

思科网络中如何配置标准ACL协议

一、什么是标准ACL协议?有什么作用及配置方法? (1)标准ACL(Access Control List)协议是一种用于控制网络设备上数据流进出的协议。标准ACL基于源IP地址来过滤数据流,可以允许或拒绝特定IP地址范…...

蓝桥杯刷题(二)

参考大佬代码:(区间合并二分) import os import sysn, L map(int, input().split()) # 输入n,len arr [list(map(int, input().split())) for _ in range(n)] # 输入Li,Si def check(Ti, arr, L)->bool:sec [] # 存入已打开的阀门在…...

【Python】牛客网—软件开发-Python专项练习(day1)

1.(单选)下面哪个是Python中不可变的数据结构? A.set B.list C.tuple D.dict 可变数据类型:列表list[ ]、字典dict{ }、集合set{ }(能查询,也可更改)数据发生改变,但内存地址不变 不…...

P3405 [USACO16DEC] Cities and States S题解

题目 Farmer John有若干头奶牛。为了训练奶牛们的智力,Farmer John在谷仓的墙上放了一张美国地图。地图上表明了每个城市及其所在州的代码(前两位大写字母)。 由于奶牛在谷仓里花了很多时间看这张地图,他们开始注意到一些奇怪的…...

JavaScript原型和原型链

JavaScript每个对象拥有一个原型对象 需要注意的是,只有函数对象才有 prototype 属性 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索&#xff…...

PyTorch之完整的神经网络模型训练

简单的示例: 在PyTorch中,可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码: import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…...

基于神经网络的偏微分方程求解器再度取得突破,北大字节的研究成果入选Nature子刊

目录 一.引言:神经网络与偏微分方程 二.如何基于神经网络求解偏微分方程 1.简要概述 2.基于神经网络求解偏微分方程的三大方向 2.1数据驱动 基于CNN 基于其他网络 2.2物理约束 PINN 基于 PINN 可测量标签数据 2.3物理驱动(纯物理约束) 全连接神经网路(FC-NN) CN…...

Linux的基本权限

一、对shell的浅显认识 shell是操作系统下的一个外壳程序,无论是Linux操作系统,还是Windows操作系统,用户都不会直接对操作系统本身直接进行操作,需要通过一个外壳程序去间接的进行各种操作 在Linux的shell外壳就是命令行&#…...

指纹加密U盘/指纹KEY方案——采用金融级安全芯片 ACH512

方案概述 指纹加密U盘解决方案可实现指纹算法处理、数据安全加密、数据高速存取(EMMC/TF卡/NandFlash),可有效保护用户数据安全。 方案特点 • 采用金融级安全芯片 ACH512 • 存储介质:EMMC、TF卡、NandFlash • 支持全系列国密…...

Cloud-Sleuth分布式链路追踪(服务跟踪)

简介 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败 GitHub - spring-cloud/spring-cloud-sl…...

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言:今天是学习 flink 的第 14 天啦!学习了 flink 高级特性和新特性之数据类型及 avro 序列化,主要是解决大数据领域数据规范化写入和规范化读取的问题,avro 数据结构可以节约存储空间,本文中结合企业真…...

python75-Python的函数参数,关键字(keyword)参数

在定义Python函数时可定义形参(形式参数的意思)这些形参的值要等到调用时才能确定下来,由函数的调用者负责为形参传入参数值。简单来说,就是谁调用函数,谁负责传入参数值。 关键字(keyword)参数 Python函数的参数名不是无意义的&#xff0c…...

Java宝典-抽象类和接口

目录 1. 抽象类1.1 抽象类的概念1.2 抽象类的语法1.3 抽象类的特点 2. 接口2.1 接口的概念2.2 接口的语法2.3 接口的特点2.4 实现多个接口2.5 接口的继承 3. 接口使用案例 铁汁们好,今天我们学习抽象类和接口~ 1. 抽象类 1.1 抽象类的概念 什么是抽象类?在面向对象中,如果一…...

6. Gin集成redis

文章目录 一:连接Redis二:基本使用三:字符串四:列表五:哈希六:Set七:管道八、事务九:示例 代码地址:https://gitee.com/lymgoforIT/golang-trick/tree/master/14-go-redi…...

DxO PureRAW:赋予RAW图像生命,打造非凡视觉体验 mac/win版

DxO PureRAW 是一款专为RAW图像处理而设计的软件,旨在帮助摄影师充分利用RAW格式的优势,实现更加纯净、细腻的图像效果。该软件凭借其强大的功能和易于使用的界面,成为了RAW图像处理领域的佼佼者。 DxO PureRAW 软件获取 首先,Dx…...

【MySQL | 第四篇】区分SQL语句的书写和执行顺序

文章目录 4.区分SQL语句的书写和执行顺序4.1书写顺序4.2执行顺序4.3总结4.4扩充&#xff1a;辨别having与where的异同&#xff1f;4.5聚合查询 4.区分SQL语句的书写和执行顺序 注意&#xff1a;SQL 语句的书写顺序与执行顺序不是一致的 4.1书写顺序 SELECT <字段名> …...

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…...

嵌入式学习day34 网络

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次…...

第九篇:内容组织——知识图谱与实体关系:让AI像专家一样“理解”你

副标题:从“字符串”到“事物”——构建品牌在AI认知世界中的知识网络 引言:当AI只记得你的“名字”,却不知道你“是谁” 陆薇在智联优品的GEO监测报告中,发现了一个让她困惑的现象。 品牌在AI答案中的提及率已经提升了近三倍,AI开始引用智联优品的品牌名称和产品参数。…...

SR-IOV与NVMe SSD的QoS性能隔离实践

1. 为什么需要SR-IOV与NVMe SSD的性能隔离&#xff1f; 在云计算和大数据场景中&#xff0c;存储性能的稳定性和隔离性一直是工程师们头疼的问题。想象一下&#xff0c;你租用了一台云服务器&#xff0c;明明配置很高&#xff0c;但磁盘性能却时好时坏——这可能就是多虚拟机共…...

避坑指南:在Win11上搞定PSCAD 5.0与MATLAB R2022a联合仿真(附VS2015+Intel Fortran配置)

Win11下PSCAD与MATLAB联合仿真避坑全攻略 电力系统仿真研究者们常常需要在PSCAD和MATLAB之间搭建联合仿真环境&#xff0c;但这个过程就像在雷区行走——稍有不慎就会触发各种兼容性问题。本文将带你避开所有已知的"地雷"&#xff0c;从版本选择到配置修复&#xff…...

用PPO算法训练AI团队:从零实现多智能体协作捕猎(附完整代码)

用PPO算法训练AI团队&#xff1a;从零实现多智能体协作捕猎 想象一下&#xff0c;你正在设计一个虚拟生态系统&#xff0c;需要让一群AI控制的捕食者学会协同围猎敏捷的猎物。这不是简单的单智能体任务&#xff0c;而是需要多个智能体在局部观测条件下做出分布式决策的复杂场景…...

新概念英语第一册137_A pleasant dream

Lesson 137: A pleasant dream 美好的梦 Watch the story and answer the question What would Julie like to do, if she had the money? She would like to travel and see the world.Key words and expressions football 足球(美&#xff1a;橄榄球)pool 赌注win …...

MCP23017 vs 74系列芯片:51单片机IO扩展方案对比与实战

MCP23017与74系列芯片&#xff1a;51单片机IO扩展方案深度解析与实战指南 当51单片机的GPIO资源捉襟见肘时&#xff0c;工程师们往往面临两种主流扩展方案的选择&#xff1a;传统的74系列逻辑芯片与现代化的MCP23017端口扩展器。这两种技术路线各具特色&#xff0c;适用于不同的…...

实战教程:星图平台私有化部署Qwen3-VL:30B,实现本地AI多模态能力

实战教程&#xff1a;星图平台私有化部署Qwen3-VL:30B&#xff0c;实现本地AI多模态能力 1. 项目概述与准备工作 1.1 为什么选择Qwen3-VL:30B&#xff1f; Qwen3-VL:30B是目前最强大的开源多模态大模型之一&#xff0c;具备300亿参数规模&#xff0c;能够同时处理文本和图像…...

Spring Boot项目里,用oshi-core 6.3.0做个服务器健康监控面板(附完整代码)

Spring Boot集成oshi-core 6.3.0构建企业级服务器监控面板实战 在微服务架构盛行的今天&#xff0c;系统监控已成为保障服务稳定性的关键环节。对于Java开发者而言&#xff0c;如何在Spring Boot项目中快速搭建一套轻量级、低侵入的服务器健康监控系统&#xff0c;是提升运维效…...

终极Cursor Pro破解指南:三步实现AI编程助手无限制访问

终极Cursor Pro破解指南&#xff1a;三步实现AI编程助手无限制访问 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tr…...

10个免费Illustrator脚本:彻底改变你的设计工作流

10个免费Illustrator脚本&#xff1a;彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否厌倦了在Adobe Illustrator中重复执行枯燥的操作&#xff1f;是…...