详谈CAS---以及ABA问题

Arduino--土壤湿度传感器使用(电阻式) 最近买了一个土壤湿度检测传感器,实物图是这样的: 我买这个模块是想要得到土壤湿度的模拟量。但我买的时候忘了买左边的蓝色模块,我开始以为这个模块是有运放功能的,但实际它是一个电压比较器和一个分压电路。 其模块的接线如图: 该模块的四线是带模拟量输出的,三线的只输出一个到达阈值的标志量。该模块的原理图如下: 该模块的测试原理为:把土壤当成一个可变电阻,随着土壤含水量的增加,土壤电阻减小。而该传感器其实就是两个电极,用来接土壤这个可变电阻。一般湿度的土壤电阻大概在几百K左右,其串连的分压电阻应该在这个数量级。 阅读详情

什么是CAS?

比较并交换(Compared-And-Swap),它是一条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。

CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后边的那个线程没有抢到,所以期望值和主物理内存的值不一样,修改失败。

CAS底层原理

前面我们用到了这个方法(以原子的方法将当前值加1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的 源码合并到下面这一张图上,unsafe的底层实现原理是CAS原理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

假设当前对象的值为5,它的地址在var2里边,
在这里插入图片描述

当前对象的那个值如果比较成功了,加1,不成功继续执行while循环重新获取
在这里插入图片描述

总结:

比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止.
CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS缺点

1,循环时间长开销很大

在这里插入图片描述

2只能保证一个共享变量的原子操作

对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性

3会引出来ABA问题

在这里插入图片描述
原子引用
对某个类进行包装可以使用原子引用
在这里插入图片描述
在这里插入图片描述

ABA问题的解决
时间戳的原子引用
在这里插入图片描述
下边的两个线程是对于解决ABA问题的
在这里插入图片描述
在这里插入图片描述

Verilog实战:手把手教你实现IEEE 754单精度浮点乘法器(附完整代码) 本文详细介绍了如何使用Verilog实现IEEE 754单精度浮点乘法器,包括标准解析、架构设计、Verilog代码实现及优化技巧。通过两级流水线设计,平衡性能与面积,适用于数字信号处理、AI加速器等高性能计算场景。 阅读详情

相关推荐

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 530

CAS详解

一、 CAS sychronized关键字保证线程同步有以下问题 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题 一个线程持有锁会导致其它所有需要此锁的线程挂起。 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲

qq_45702658的博客 440

3GPP协议解读_物理层系列(一)_物理层协议怎么看?

5G NR相关协议一般都在38系列,点进去以后可以看到,38.2xx系列为物理层相关协议,为了掌握物理层相关知识,应该怎么看协议呢?我建议从38.201读起,对38.2xx系列协议有一个整体的把握。

JCMLSY的博客 1327

CAS的原理理解

文章目录CAS原理理解通过Java代码测试 CAS原理理解 CAS算法,全名叫CompareAndSwap ,即:比较与交换。 接下来采取多个线程同时操作同一个共享变量逻辑图的方式,说明什么是CAS。 1、假设此时的内存中,该共享变量的数据值为:except = 0。 2、当多个线程对该共享变量进行数据变更时,会将共享变量的数据拷贝副本至自己的工作内存中。 3、对指定的工作内存中的数据进行修改操作,假设线程一需要将数据修改成1,此时则绑定一个变量信息为refresh = 1;同理线程2则为refresh

专注写bug 615

车底盘:阿克曼转向和四轮差速

特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。

bing_feilong的博客 1919

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 242

CAS算法中的ABA问题的解决

CAS算法中的ABA问题的解决

荣山的博客 1936

Modbus CRC和LRC算法研究及代码实现

一、CRC(循环冗余校验) 1 CRC16实现流程 XOR = 异或 N = 字节的信息位 POLY = CRC16 多项式计算 = 1010 0000 0000 0001 (生成多项式 = 1 + x2 + x15 + x16) 在CRC16中,发送的第一个字节位低字节 2 CRC16实例推导 3 CRC16代码实现 unsigned short CRC16(unsigned char *a...

Hi, Boy 2891

浅谈一下CAS和ABA问题

浅谈一下CAS和ABA问题 1 CAS概念 CAS(Compare And Swap)比较并交换,CAS 算法的过程是这样:它包含 3 个参数CAS(V,A,B)。V 表示要更新的变量(内存值),A 表示预期值,B 表示新值。当且仅当 V 值等于 A 值时,才会将 V 的值设为B,如果 V 值和 A 值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS 返回当前 V 的真实值。CAS 操作是抱着乐观的态度进行的(乐观锁),它总是认为自己可以成功完成操作。当多个线程同时使用 CAS 操作一

做兴趣使然的Hero 1785

ComfyUI实战:AnimateDiff与ControlNet结合,打造无缝风格化视频转绘

本文详细介绍了如何利用ComfyUI平台,结合AnimateDiff与ControlNet插件,实现高质量的视频风格化转绘。通过搭建节点工作流、调整关键参数,有效解决画面闪烁与失真问题,并分享了进阶玩法与常见问题解决方案,帮助用户轻松打造流畅、风格统一的动态视觉效果。

weixin_29039773的博客 334

Keil MDK 5.37及之后版本 安装AC5(ARMCC)编译器详细步骤

由于Keil 5.37及之后版本不再默认安装AC5(ARMCC)编译器,这就会导致由AC5编译的工程无法正常编译,往往输出窗口会提示以下信息:*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.

s_Modesto的博客 1万+

CAS原理——乐观锁机制

当预期值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行 CAS 操作。这个共享变量是obj对象的一个成员属性,valueOffset表示这个共享变量在obj类中的内存偏移量。很显然方法都是用native来修饰的,这就表明这个方法不是由Java来实现的。如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。,在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。

小小本科生 1161

【华为OD机试】贪吃蛇(python, java, c++, js)

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。 给定一个NM的数组arr,代表NM个方格组成的版图,贪吃蛇每次移动一个方格。 若arr[i][j] == H,表示该方格为贪吃蛇的起始位置; 若arr[i][j] == F,表示该方格为食物, 若arr[i][j] == E,表示该方格为空格。 贪吃蛇初始长度为1,初始移动方向为向左。

A_D_I_D_A_S的博客 540

详解CAS及ABA问题

CAS以及ABA问题

m0_73920844的博客 3027

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CAS中的ABA问题

ABA问题是CAS机制中出现的一个问题,这里先说明一下CAS和原子操作: CAS:Compare And Swap,比较并交换。是java.util.concurrent包实现的区别于同步锁synchronized同步锁的一种乐观锁。CAS有三个操作数,内存值V,预期值A,要修改的值B,当且仅当内存值V与预期值A相等时,将内存值V修改为B,否则什么也不做。 原子操作:“原子”代表最小的执行单位,该操作在执行完毕前不会被任何其他任务或者事件打断。 AtomicInteger类的compareAndSet通过原

weixin_42671172的博客 8265

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

什么是CAS?CAS的ABA问题,ABA问题会导致什么后果?

什么是CAS? 在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称...

祁东握力的博客 9576

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CAS的ABA问题,ABA问题会导致什么后果?

ABA问题会导致什么后果?(以下为转载) https://blog.youkuaiyun.com/wufaliang003/article/details/78797203 一、并发业务场景 库存业务,stock(sid, num),其中: sid为库存id num为库存值 如上图所示,两个并发的查询库存操作,同时从数据库都得到了库存是5。 接下来用户发生了并发的库存扣减动作: ...

祁东握力的博客 1万+

CAS机制是什么,如何解决ABA问题

将之前我们先来了解独占锁和乐观锁。 独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。 一、CAS 操作 乐观锁用到的机制就是CAS,Compare and Swap。 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值...

riemann_的博客 5406

CAS如何解决ABA问题?

CAS操作在并发编程中高效,但存在ABA问题,即共享变量在CAS操作前被其他线程修改后又恢复原值,导致CAS错误执行更新。为解决此问题,Java提供了两种机制:1. AtomicStampedReference,通过引入版本号,每次更新时同时修改版本号,CAS操作不仅检查值还检查版本号,确保值未被篡改。2. AtomicMarkableReference,使用布尔标记位代替版本号,更新时改变标记位,CAS操作同时检查值和标记位,避免ABA问题。这两种方法通过附加机制确保CAS操作的正确性,有效解决了ABA问

weixin_46072507的博客 1214

Java中解决CAS机制出现的ABA问题

Java中解决CAS机制出现的ABA问题? 1、先了解一下什么是CAS? 一句话总结就是: 比较并交换(compare and swap)是一条CPU并发原语 CAS的公式如下: CAS(V,A,B) 1:V 表示内存中的地址 2:A 表示预期值 3:B 表示要修改的新值 CAS的功能:就是预期值A与内存中的值相比较,如果相同则将内存中的值改变成新值B 2、CAS的底层原理? 换句话说也就是CAS为什么能保证原子性? (1)靠的是底层的Unsafe类 (2)Unsafe类是CAS的核心类,由于java无法

sxp知识共享 4493

CAS中的ABA问题如何解决

什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常...

疯一样的女子 6153

CAS机制之ABA问题

这篇博客主要讲解两个问题: 1,Java当中CAS底层实现 2,CAS的ABA问题和解决办法 Java当中CAS底层实现 首先我们来看JDK1.7的AtomicInteger类的incrementAndGet源码: private volatile int value; public final int get() { return value; } public final in...

手写ArrayList 2674

CAS以及ABA问题

CAS及ABA

jmlkid的博客 727

CAS和ABA问题

CAS和ABA问题    引言:乐观锁和悲观锁的概念    悲观锁:悲观锁悲观地认为,自己执行操作的过程中一定有人修改过自己操作的值,所以在自己操作之前会加上一把锁,synchronized就是一个悲观锁。    乐观锁:乐观锁则乐观地认为,当自己执行操作时不会有人修改自己操作的值,所以采用不加锁的机制,只是在操作完成的那一刻发现产生冲突,则会重新执行操作,直到成功为止。CAS算法就是乐观锁的一种...

that_is_cool的博客 3256

CAS原理分析及ABA问题详解

文章目录什么是CASUnsafe源码分析CAS的缺点ABA问题循环时间长开销大只能保证一个共享变量的原子操作CAS的应用参考 什么是CAS CAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是原子性的操作,其实现方式是通过借助C/C++调用CPU指令完成的,所以...

xueba8的博客 1978

CAS的ABA问题

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

zrwcnm的博客 1124
上一篇: 什么是JMM以及volatile的特性(对于volatile的理解)
下一篇: java--锁机制
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值