【面试八股】:CAS指令

news2025/4/1 1:36:20

一、CAS 面试题

1. 说说CAS、CAS有什么问题(ABA)?(美团一面)

Compare And Swap 对比交换(原子指令)

CAS是 CPU指令 操作系统原生 API,JVM对它进行了封装(C++),供我们使用。

通过判断 内存寄存器(预期值) 中的值是否一致,来决定是否执行 写指令,改变内存的值

判断在赋值前是否有 其他线程 改变了 内存 中的值一致就说明没有改变,通过赋值改变内存中的值。不一致就返回,预期值改变 去进行下一次循环


2. CAS如果失败会发生什么?(科大讯飞Java后端)

CAS一般搭配循环使用,循环中每次CAS失败后预期值会被更新为最新的内存值!!!

然后进入循环再次进行CAS操作

二、原子类

利用CAS原子的特性,对读写操作的一体操作,封装成一个个类

它们对基本 数据类型 int double.....进行了封装 ,提供一些作用与 ++ ,+=,这类操作的方法,区别是它们操作是原子的,所以不会出现线程安全问题,我们常用的是 Integer Long 类型。


1. 常用方法:


2. 代码示例:



三、CAS实现自旋锁

1. 伪代码:

通过 CAS 看当前锁是否被某个线程持有.  
 // 如果这个锁已经被别的线程持有, 那么就自旋等待.  
 // 如果这个锁没有被别的线程持有, 那么就把 owner 设为当前尝试加锁的线程.  

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;
 }
}

四、ABA问题(详解)

我们已经知道了CAS这条指令的基本原理,就是判断当前内存中的值是否和我们预期的值一致,来判断是否有其他线程已经修改过内存中的值,成功就执行写操作,失败就改变预期值,从而实现原子的特性,这一切看着很合理。


但是它有个缺陷:ABA问题,这个问题就是说,我们在判断是否与预期值一致的时候如果已经有个线程将内存中的 改成别的 又将它改成 A CAS是察觉不到的这就是ABA问题

一般这也不会出大问题,但是有极端情况


举个栗子:

假设你的银行卡内有1000元,现在你往出转账500元ATM机卡了,你狂点两下意外产生两个线程都是要-500元

第一个线程内存值是1000,预期值是1000,判断相等后,执行-500的操作,

第二个线程内存变成500,预期值1000不相等,不执行

上方线程二出现问题,结束,这是完美结局。


假如!!!!情况变了第一个线程执行完,中间的时候有人给你转账500

线程二读内存发现 内存是1000(500+500),预期是1000🆗了直接-500........

这样的结果就是,你卡里有1000转出去500进去500一看余额不是1000了,变成500了,寄了。。。。。


虽然我们说,这个情况太巧合了,正好出来两个线程,正好两个线程 中间 加了 和 扣款 相同数目的钱,可是再小的概率,这件事也一定会出现,我们就提出了针对ABA问题的解决策略


1. 解决策略:

对内存中的值赋予一个 版本号,版本号 只加不减 ,每经历一次操作成功版本号++如果发现接下来的操作中,版本号 高于我们 预期的版本号就不执行操作


拿我们刚刚的例子来说:我们给余额一个版本号 并且初始化为 1 ,经过第一次取钱,版本号变成2

经过别人转给你,变成3,等到第二个线程版本号为2才执行,发现你这里是3,直接不执行

通常会采用一些方法来增加版本号的唯一性,比如使用时间戳、随机数等来初始化版本号


但是时间戳的使用也要谨慎,因为我们的地球公转时间和自转时间不是标准的365倍,所以我们要每四年为一个闰年,这一年会多一天,但是我们为了计算机的时间准度,我们会执行闰秒,也就是手动把时间往回调1秒这样,会每隔一段时间执行闰秒。根据的是国家授时中心的数据,往往这一秒就会导致一些问题,所以时间虽然是正向流逝的,但是也有倒流的情况,用时间戳要谨慎......

                                                                    时间倒流

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

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

相关文章

el-radio-group 中 el-radio-button value未能绑定上数值数据

这样绑定到admin后不会随着admin的值显示 在value加上 : 后成功显示

JSP(实验):带验证码的用户登录

[实验目的] 1.掌握应用request对象获取表单提交的数据。 2.掌握解决获取表单提交数据产生中文乱码的问题。 3.掌握使用response对象进行定时跳转功能。 4.掌握使用session对象完成登录和注销功能。 [实验要求] 设计带验证码…

集多功能为一体的软件,支持批量操作。

今天我给大家分享一个超实用的小工具,真的是太好用了!这个软件是吾爱大神无知灰灰制作的,它能直接一键把webp格式的图片转换成png格式。 webp转为png 一键操作,支持压缩 其实,作者最近在工作中经常遇到webp格式的图片…

linux压缩指令

今天我们来了解一下linux压缩指令,压缩是我们文件传输的一种重要手段,对此,我们是必须学习压缩指令的,那么话不多说,来看. 1.grep过滤查找,管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。 基本语法&#x…

污水处理厂人员定位方案-UWB免布线高精度定位

1. 方案概述 本方案采用免布线UWB基站与北斗卫星定位融合技术,结合UWBGNSS双模定位工卡,实现污水处理厂室内外人员高精度定位(亚米级)。系统通过低功耗4G传输数据,支持实时位置监控、电子围栏、聚集预警、轨迹回放等功…

Elasticsearch 高级

Elasticsearch 高级 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索Elasticsearch 搜索高级Elasticsearch高级(本文) 1. nested 类型 1.1 介绍 Elasticsearch 中的 nested 类型允许你在文档内存储复杂的数据结构,比如一个…

C语言笔记数据结构(链表)

希望文章能对你有所帮助,有不足的地方请在评论区留言指正,一起交流学习! 目录 1.链表 1.1 链表概念和组成 1.2 链表的分类 1.3 顺序表和链表 2.单链表(无头单向不循环链表) 2.1 结点的创建 2.2 创建新的结点 2.3 单链表的打印 2.4 尾…

Leetcode 两数相除

✅ LeetCode 29. 两数相除 — 思路总览 🧩 题目要求 给定两个整数 dividend 和 divisor,实现 整数除法,不能使用乘法 *、除法 / 和取余 % 运算符。 要求返回的结果应为 向零截断的整数商,即: 正数向下取整&#xf…

人工智能图像识别Scala介绍

Scala 一.Scala 简介 Scala即Scalable Language(可伸缩的语言),Scala 语言是由 Martin Odersky 等人在 2003 年开发的,并于 2004 年首次发布。意味着这种语言设计上支持大规模软件开发,是一门多范式的编程语言。 Sc…

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…

c#的.Net Framework 的console 项目找不到System.Window.Forms 引用

首先确保是建立的.Net Framework 的console 项目,然后天健reference 应用找不到System.Windows.Forms 引用 打开对应的csproj 文件 在第一个PropertyGroup下添加 <UseWindowsForms>true</UseWindowsForms> 然后在第一个ItemGroup 下添加 <Reference Incl…

蓝桥杯嵌入式学习笔记

用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯&#xff0c;以及点亮还是熄灭 按键cubemx配置k…

Blender多摄像机怎么指定相机渲染图像

如题目所说&#xff0c;当blender的场景里面有摄像机的时候&#xff0c;按F12可以预览渲染结果&#xff0c;但是当有多个摄像机的时候就不知道使用哪个进行渲染了。 之前在网上没有找到方法&#xff0c;就用笨方法&#xff0c;把所有的摄像机删除&#xff0c;然后设置自己需要…

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读&#xff1a;TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务&#xff0c;轻松应对海量功率、电能及输入输出数据的实时统计与分析&#xff0c;并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外&#xff0c;taosX 强大的 transform 功能帮助用…

观察者模式:解耦对象间的依赖关系

观察者模式&#xff1a;解耦对象间的依赖关系 JDK 中曾直接提供对观察者模式的支持&#xff0c;但因其设计局限性&#xff0c;现已被标记为“过时”&#xff08;Deprecated&#xff09;。不过&#xff0c;观察者模式的思想在 JDK 的事件处理、spring框架等仍有广泛应用。下面我…

windows第二十章 单文档应用程序

文章目录 单文档定义新建一个单文档应用程序单文档应用程序组成&#xff1a;APP应用程序类框架类&#xff08;窗口类&#xff09;视图类&#xff08;窗口类&#xff0c;属于框架的子窗口&#xff09;文档类&#xff08;对数据进行保存读取操作&#xff09; 直接用向导创建单文档…

通信协议之串口

文章目录 简介电平标准串口参数及时序USART与UART过程引脚配置 简介 点对点&#xff0c;只能两设备通信只需单向的数据传输时&#xff0c;可以只接一根通信线当电平标准不一致时&#xff0c;需要加电平转换芯片&#xff08;一般从控制器出来的是信号是TTL电平&#xff09;地位…

Java入门知识总结——章节(二)

ps&#xff1a;本章主要讲数组、二维数组、变量 一、数组 数组是一个数据容器&#xff0c;可用来存储一批同类型的数据 &#x1f511;&#xff1a;注意 类也可以是一个类的数组 public class Main {public static class Student {String name;int age; // 移除 unsignedint…

Verilog 中寄存器类型(reg)与线网类型(wire)的区别

目录 一、前言 二、基本概念与分类 1.寄存器类型 2.线网类型 三、六大核心区别对比 四、使用场景深度解析 1.寄存器类型的典型应用 2. 线网类型的典型应用 五、常见误区与注意事项 1. 寄存器≠物理寄存器 2.未初始化值陷阱 3.SystemVerilog的改进 六、总结 …

【Linux加餐-验证UDP:TCP】-windows作为client访问Linux

一、验证UDP-windows作为client访问Linux UDP client样例代码 #include <iostream> #include <cstdio> #include <thread> #include <string> #include <cstdlib> #include <WinSock2.h> #include <Windows.h>#pragma warning(dis…