CAS算法详解

article/2025/8/30 2:58:34

                                                 CAS算法

1、CAS概念:

CAS是CompareAndSwap的缩写,中文意思是:比较并替换。当要进行CAS操作时,先比较内存地址和原来预期的

地址比较,如果相同,表示这块内存地址没有被修改,可以用新地址替换,否则说明该地址被修改了,取消替换操作。

整个过程就是个原子操作。以线程为例,CAS算法先记录要修改地址的值,然后在修改时查看要修改的地址是否被

其他线程修改。然后根据情况决定进行哪种操作。

2、CAS应用:

1:在原子类变量中,如java.util.concurrent.atomic中的AtomicXXX,都使用了这些底层的JVM支持为数字类型的引用

类型提供一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时都直接或间接的使用了这些原子变量类。

2:CAS的原子操作可以用来实现乐观锁,当资源竞争程度不大的时候,不需要阻塞线程,这时候就可以通过CAS的

原子操作通过短暂的占用处理机来减少唤醒和切换线程的开销。

3、CAS缺点:

1、如果竞争资源程度比较大,或者同步竞争资源的线程比较多,此时不适合用CAS来实现乐观锁,因为不断的自旋(whie)

循环询问,这样会造成cpu的浪费。这时候应该采用synchronized来保证同步的准确性和减少cpu浪费。

2、可能产生ABA问题

加入有一个链表,头部是A,连接B

这时候线程a通过CAS操作把B放在链表的头部,首先记录了链表的头部A,在执行CAS操作之前,

另一个线程先把A,B出栈,然后push D,C,A,此时B处于游离态。

然后线程a回来发现栈顶是A,CAS操作成功。把B放在栈顶,实际上应该是BADC,而实际是:

B.next()为空,C D消失了。

从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet

方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该

引用和该标志的值设置为给定的更新值。这也是我们上面图片所展示的。

3、当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环

CAS就无法保证操作的原子性,但是我们可以把多个共享变量放在一个类里,在jdk1.5中提供了AtomicReference类来

保证引用对象之间的原子性。

本文部分参考博客:Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS


http://chatgpt.dhexx.cn/article/8oNEJICG.shtml

相关文章

CAS的原理和使用

CAS 文章目录 CAS一、学习CAS首先了解原子类?1. 何为原子类 二、 CAS是什么1. CAS是什么2. CAS原理3. 使用CAS实例代码4. CAS属于硬件级别保证5. 源码分析 三、CAS底层原理?如果知道,谈谈你对UnSafe的理解1. UnSafe2. 我们知道i线程不安全的&…

对cas算法的理解

cas算法主要关心3个值:内存值V,预期值A,要更新的新值B 如下图所示: 注:t1,t2线程是同时更新同一变量56的值 因为t1和t2线程都同时去访问同一变量56,所以他们会把主内存的值完全拷贝一份到自己…

CAS原理分析

CAS的英文为Compare and Swap 翻译为比较并交换。 CAS加volatile关键字是实现并发包的基石。没有CAS就不会有并发包,synchronized是一种独占锁、悲观锁,java.util.concurrent中借助了CAS指令实现了一种区别于synchronized的一种乐观锁。 什么是乐观锁与…

CAS详解

一、CAS概念 1.1 CAS是什么 Compare And Swap 比较并交换 1. 如果线程的期望值跟物理内存的真实值一样,就更新值到物理内存当中,并返回true 2. 如果线程的期望值跟物理内存的真实值不一样,返回false,那么本次修改失败&#xf…

CAS算法的理解及应用

应用 原子操作类,例如AtomicInteger,AtomicBoolean …适用于并发量较小,多cpu情况下; Java中有许多线程安全类,比如线程安全的集合类。从Java5开始,在java.util.concurrent包下提供了大量支持高效并发访问…

解析CAS算法原理

解析CAS算法原理 什么是CAS?CAS原理概念实现形式底层原理 案例CAS的缺点ABA问题ABA问题如何产生的?原子的引用时间戳原子的引用利用AtomicStampedReference解决ABA问题案例 什么是CAS? CAS,全称Compare And Swap,顾名…

深入解析CAS算法原理

目录 一、CAS的基本概念二、CAS算法理解三、CAS开销四、CAS算法在JDK中的应用 一、CAS的基本概念 CAS:Compare and Swap,即比较再交换,是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管…

CAS算法实现

https://blog.csdn.net/bluetjs/article/details/52261490?locationNum15&fps1 1.什么是cas? cas是一种无锁算法(非阻塞算法:一个线程的失败或者挂起不应该影响其他线程的失败或者),是compare and swap的缩写&am…

修改Idea的jdk版本

概述 idea很多地方都设置了jdk版本,不同模块的jdk版本也可能不一样,下面整理下涉及jdk或者jre版本的几个地方。 方法一 File - Settings - Build, Execution, Deployment - Build Tools - Maven - Importing 方法二 File - Settings - Build, Exec…

Linux切换jdk版本

开发常识 命令行输入下列命令,然后输入 1 、2、3 选择你想要的 jdk 版本: sudo update-alternatives --config java选择完之后查看 jdk 版本: java -version

如何查看JDK版本信息

如何查看JDK版本号 一、前言二、 Windows的dos窗口 一、前言 在下载某些工具时需要知道自己电脑安装的JDK版本号,这里介绍了一种可以看自己JDK版本号的方法。 二、 Windows的dos窗口 1.电脑WindowsR键,打开命令行窗口   2.在命令行里面输入cmd;   3…

mac安装多个JDK版本

因对不同版本的JDK需求,有时候需要安装多个切换使用,这里我为Mac安装了多个JDK。在已有JDK8的基础上又安装了JDK11。 1、国内镜像下载JDK11,下载地址:https://repo.huaweicloud.com/java/jdk/11.0.29/jdk-11.0.2_osx-x64_bin.dmg…

更改JDK版本

1、更改环境变量:JAVA_HOME的路径(此路径下要有bin目录) 换成你要用的java的版本所在的路径 2、找到系统变量path下的java路径,将此路径下的三个文件全部删掉 3、打开regedit 修改数据数值即可,如下图切换成功

查看javajdk版本

查看当前电脑的Java/JDK版本的方法 1.winR 打开运行窗口,输入 cmd 2.在控制台中输入java --version或者java -version,即可查看Java版本号 Java所有版本 版本号 发布日期 JDK Version 1.0 1996-01-23 Oak(橡树) JDK Version 1.1 1997-02-19 …

如何更换jdk版本

如何更换jdk版本 因为很多时候需要切换jdk版本。也是走了很多弯路才弄好。此次演示的是将1.7 的版本更换成1.8 的。下面是详细步骤先查看当前版本,输入cmd 打开命令提示符后输入 java -version 即可 可以将1.8 的jdk 于1.7 的jdk 安装在同一个目录下,会…

linux 安装多版本jdk

1、先要安装多个版本的jdk,可以从官网进行下载,然后解压到你需要的目录 例如:/home/xxx/Documents/jdk8 /home/xxx/Documents/jdk17 2、先执行软连接设置,将jdk所在的真实路径建立连接 #数字越大默认级别越高sudo updat…

IDEA 切换 JDK 版本

IDEA 中一个项目切换不同的 JDK 版本 File -> Project Structure -> Project -> SDK: IDEA 一个 Project 内,多个 Module 间使用不同的 JDK 问题描述 项目结构如下: 想要在这样一个 Project 中的多个 Module 之间使用不同的 J…

查看 jdk 版本及安装路径

1、查看电脑的 jdk 版本 (1)键盘 win R 打开 “运行” ,输入 cmd 回车,打开命令窗口 (2)输入 java -version 查看安装的 jdk 版本 2、查看 jdk 的安装路径 (1)在命令窗口输入 jav…

安装多个jdk版本并切换

官网下载:Java Downloads | Oracle 我们在学习的过程中 经常用到不同的jdk版本 那么如何在一台电脑上同时安装2个jdk版本 并进行切换呢? 我这里面以jdk1.8 和jdk17为例 我已经成功安装2个jdk 一. 查看安装的jdk版本 二 配置 1.配置JAVA_HOME 在系…

更换JDK版本

1.配置环境变量 更换CLASS_PATH指向目录,更换JAVA_HOME指向目录 更换PATH变量中的参数,将jdk与jre指向更换掉 控制台输入java -version 可以观测到版本是否变更 2.IDEA更换jdk配置 需要在idea中选择file--project structure如下图操作更换相关配置 在file--settings中进行下图…