【Java里的CAS机制】什么是CAS,CAS机制

article/2025/9/29 15:29:21

CAS

  • 一、什么是CAS
  • 二、CAS的三大缺点
    • ABA问题


一、什么是CAS

前面两篇文章提到CAS操作,那么CAS操作到底是什么东西呢?今天我们来了解一下CAS机制

CAS(Compare-And-Swap),它是一条CPU并发原语,用于判断内存中某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。CAS是一种系统原语,Java中利用原子操作类实现,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。如AtomicBoolean,AtomicUInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型的原子性操作。

我们来分析两段代码更好地理解一下CAS机制:
代码如下:

package CAS;public class threadeg {public static int count=0;public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<2;i++) {new Thread(new Runnable() {public void run() {try {Thread.sleep(10);}catch(InterruptedException e){e.printStackTrace();}for(int j=0;j<10;j++) {//每个线程对count自增20count++;}}}).start();}try {Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}System.out.println("count="+count);}}

上面例子运行出来的count结果不能保证是20,因为这段代码是非线程安全的。他没办法保证我们最后运行出来的结果是20。

接下来我们用AtomicInteger类实现:

package CAS;import java.util.concurrent.atomic.AtomicInteger;public class threadeg2 {public static AtomicInteger count=new AtomicInteger(0);public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<2;i++) {new Thread(new Runnable() {public void run() {try {Thread.sleep(10);}catch(InterruptedException e){e.printStackTrace();}for(int j=0;j<20;j++) {//每个线程对count自增20count.incrementAndGet();}}}).start();}try {Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}System.out.println("count="+count);}}

使用AtomicInteger之后,最终的输出结果可以保证是20。有人说可以用synchronized关键字来保证线程安全。但是使用AtomicInterger类在某种程度上会比synchronized关键字好,因为synchronized关键字对于没有竞争到锁资源的线程会进行阻塞处理,这时候发生用户态与内核态之间的转换,十分消耗资源,代价较大。尽管后面的对synchronized进行了优化,但是线程一多还是存在该问题。而Atomic操作类的底层正是用到了“CAS机制”。

CAS叫做CompareAndSwap,比较并交换,主要是通过处理器的指令来保证操作的原子性,它包含三个操作数:
1、变量内存地址,V表示
2、旧的预期值,A表示
3、准备设置的新值,B表示
当执行CAS指令时,只有当V等于A时,才会用B去更新V的值,否则就不会执行更新操作。

当多个线程使用CAS操作一个变量时,只有一个线程会成功,并成功更新变量值,其他线程均会失败。失败线程会重新尝试或将线程挂起(阻塞)

二、CAS的三大缺点

CAS的缺点主要有3点:

(1)ABA问题:ABA的问题指的是在CAS更新的过程中,当读取到的值是A,然后准备赋值的时候仍然是A,但是实际上有可能A的值被改成了B,然后又被改回了A,这个CAS更新的漏洞就叫做ABA。只是ABA的问题大部分场景下都不影响并发的最终效果。Java中有AtomicStampedReference来解决这个问题,他加入了预期标志和更新后标志两个字段,更新时不光检查值,还要检查当前的标志是否等于预期标志,全部相等的话才会更新。

(2)循环时间长开销大:自旋CAS的方式如果长时间不成功,会给CPU带来很大的开销。(不知道自旋是什么的可以看我写的关于锁的文章。)

(3)只能保证一个共享变量的原子操作:只对一个共享变量操作可以保证原子性,但是多个则不行,多个可以通过AtomicReference来处理或者使用锁synchronized实现。

ABA问题

ABA问题空讲有点不明白所以我们举个例子。
假设,小童银行卡里有1000元。要用一个遵循CAS的提款机提款500元去买衣服。此时由于提款机硬件开小差,将小童的提款操作提交了两次,此时有两个线程两个线程都是获取当前值1000元,期望更新值为500元。正常情况下,应该是两个线程一个成功一个失败,小童的余额被扣款一次

此时的状态:
在这里插入图片描述
此时假设线程1首先执行成功,而线程2由于某些原因阻塞。恰巧,小童的妈妈得知小童要买鞋,给小童汇款500元(此次操作为线程3)。

此时的状态为:
在这里插入图片描述
此时线程2仍在阻塞,所以提款机执行线程3。且由于CAS检测成功,所以线程3执行成功
在这里插入图片描述
这时候线程2恢复运行,由于一开始线程2获取的当前值是1000,且现在的值也为1000,所以CAS检测成功,将值更改为500。
在这里插入图片描述
原本线程2应当提交失败,小童的银行卡余额应该保持为1000元,结果由于CAS里的ABA问题导致线程2提交成功了。所以小童很悲催的少掉了500块钱。

既然遇到了这个问题那么怎么解决ABA问题呢?

JDK的Atomic包里提供了一个类AtomicStampedRefernce来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查标志stamped是否为预期标志,如果全部一致,则继续。


此篇文章为学习笔记,是对别人知识的理解,加上自己的一些个人理解汇聚而成。若有侵权联系删除。写作不易,望好兄弟们来个三连支持。感激不尽。
注:原文出处为https://mp.weixin.qq.com/s/-xFSHf7Gz3FUcafTJUIGWQ


http://chatgpt.dhexx.cn/article/lT3whskf.shtml

相关文章

CAS机制是什么?

首先我们需要了解为什么有CAS机制的存在&#xff1f;那我们就不得不先知道互斥同步和非阻塞同步。 互斥同步 互斥同步面临的主要问题是进行线程阻塞和唤醒带来的性能开销&#xff0c;因此这种同步也叫阻塞同步。互斥同步属于悲观的并发策略&#xff0c;其总是认为只要不做同步…

CAS单点登录

简介 CAS是Central Authentication Service的缩写&#xff0c;中央认证服务&#xff0c;一种独立开放指令协议。CAS 是 耶鲁大学&#xff08;Yale University&#xff09;发起的一个开源项目&#xff0c;旨在为 Web 应用系统提供一种可靠的单点登录方法&#xff0c;CAS 在 200…

什么是CAS(乐观锁)

本文讲解CAS机制&#xff0c;主要是因为最近准备面试题&#xff0c;发现这个问题在面试中出现的频率非常的高&#xff0c;因此把自己学习过程中的一些理解记录下来&#xff0c;希望能对大家也有帮助。 什么是悲观锁、乐观锁&#xff1f;在java语言里&#xff0c;总有一些名词看…

CAS机制

文章目录 1、什么是CAS&#xff1f;2、CAS实现原子操作的3大问题&#xff1f;3、Unsafe类4、AtomicReference5、CAS——自旋锁 1、什么是CAS&#xff1f; CAS的全称是 Compare And Swap&#xff08;比较再交换&#xff0c;确切一点称之为&#xff1a;比较并且相同再做交换&…

Java 中 CAS 是什么,有哪些实际应用场景

CAS 是什么 CAS&#xff08;Compare And Swap&#xff09;是一种并发编程中的原子操作&#xff0c;用于实现多线程之间的同步。在 Java 中&#xff0c;CAS 操作通过 sun.misc.Unsafe 类实现。 CAS 操作是一种乐观锁机制&#xff0c;它假设对于共享变量的修改操作不会引起冲突…

Java 什么是 CAS? 通俗易懂

Java 并发机制实现原子操作有两种&#xff1a; 一种是锁&#xff0c;一种是CAS。 CAS是Compare And Swap&#xff08;比较并替换&#xff09;的缩写。 java.util.concurrent.atomic中的很多类&#xff0c;如&#xff08;AtomicInteger AtomicBoolean AtomicLong等&#xff09;都…

什么是CAS?CAS有什么缺点?

文章目录 什么是CASCAS 举例说明CAS 底层实现CAS缺陷 什么是CAS CAS 的全称是 Compare And Swap 即比较交换&#xff0c;其算法核心思想如下函数&#xff1a;CAS(V,E,N) 参数&#xff1a; V 表示要更新的变量E 预期值N 新值 如果 V 值等于 E 值&#xff0c;则将 V 的值设为 …

【ceph】存储领域的CAS是什么?什么是CAS|Open CAS|缓存加速软件

目录 什么是CAS 出现原因和应用场景&#xff1a; 初始Open CAS What SPDK Block Device Open CAS Linux Whats Cache? Whats Cache Object? Cache operations Cache Configuration Cache Mode Cache line size Whats Core? Whats Cache line&#xff1f; Cach…

java常见面试考点(二十五):CAS是什么

java常见面试考点 往期文章推荐&#xff1a;   java常见面试考点&#xff08;二十&#xff09;&#xff1a;Elasticsearch 和 solr 的区别   java常见面试考点&#xff08;二十一&#xff09;&#xff1a;单点登录   java常见面试考点&#xff08;二十二&#xff09;&…

CAS是什么?彻底搞懂CAS

CAS&#xff08;Compare-And-Swap&#xff09;,它是一条CPU并发原语&#xff0c;用于判断内存中某个位置的值是否为预期值&#xff0c;如果是则更改为新的值&#xff0c;这个过程是原子的。 CAS基本原理 CAS并发原语体现在Java中就是sun.misc.Unsafe类中的各个方法。调用UnSa…

(一)CAS是什么?

前言 随着企业数字化转型的不断发展&#xff0c;应用系统越来越多&#xff0c;每个系统都有一套用户系统&#xff0c;用户在操作不同的系统时&#xff0c;需要多次登录&#xff0c;而且每个系统的账号都不一样&#xff0c;这对于用户来说&#xff0c;很不方便。这时候要做到 在…

CAS是什么

目录 没有CAS之前 使用CAS之后 CAS是什么 CAS底层原理&#xff1a;unsafe类 Unsafe new AtomicInteger().getAndIncrement()流程 CAS缺点 1 循环时间长开销很大 2 ABA问题 ABA代码演示 如何解决&#xff1f;&#xff1a;通过AtomicStampedReference版本号 3不能保…

CAS 是什么?

CAS又称 自旋锁、无锁&#xff0c;是一种乐观锁 compare and swap 的缩写 意为: 比较并交换 , 实现并发算法的常用技术 , 就是说我不用加锁 , 也能保证 ( 加锁会影响效率&#xff0c;可以考虑使用原子操作类 ) 原子性 , 当多个线程尝试使用 CAS 同时更新同一个变量时&#xf…

什么是CAS

文章目录 一、CAS是什么二、CAS 可以解决什么问题三、CAS实现原子操作的问题 一、CAS是什么 CAS的全称为compare and swap 或者compare and exchange,意思为比较和交换。CAS流程如下&#xff1a; 假设我们有一个共享变量i&#xff0c;初始值为0。我们现在要对i进行加1的操作…

metasploit图形化工具 Armitage

Metasploit默认使用PostgreSQL存储渗透测试所需的数据表&#xff0c;所以在启动Armitage之前需要首先启动PostgreSQL服务和Metasploit服务&#xff0c;然后再启动armitage&#xff0c;弹出对话框询问是否连接Metasploit的RPC信道&#xff0c;依次选择“connect”、“是”选项。…

ARM..

一 关于arm 1 arm的三种含义 (1) 一个公司的名称 Advanced RISC Machine (2) 一类处理器的统称 (3) 一种技术的名称 &#xff08;RISC&#xff09; ARM是以一家设计处理器的公司&#xff0c;这家公司设计的处理器统称为ARM&#xff0c;它们使用的指令集是RISC&#xff08;精简指…

01-Introducing the Arm architecture

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈目录 1、Overview2、About the Arm architecture3、架构(architecture)到底是什么意思呢

傻瓜式渗透Armitage的使用

目录 Armitage的基本介绍 安装 1 启动Armitage 1、Armitage启动前初始化&#xff1a; 2、Armitage启动的三种方法&#xff1a; 2 使用Armitage生成被控端和主控端 1、Armitage的工作界面&#xff1a; &#xff08;1&#xff09;区域1&#xff1a; &#xff08;2&#…

Kali Linux Armitage生成被控端和主控端

目录 说明使用 Armitage生成被控端和主控端 说明 按照《Kali Linux2 网络渗透测试实践指南 第二版 》第八章操作 仅供学习讨论使用&#xff0c;请勿进行非法操作 使用 Armitage生成被控端和主控端 选中“payload”&#xff0c; 然后选择“windows” ➡️“meterpreter”&…

[architecture]-arm exclusive机制介绍

关键词:spinlock,原子操作,独占访问,exclusive,inclusive,mutex,Semaphore,互斥,同步,同步原语 快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/…