CAS原理详解

article/2025/8/30 2:57:48

CAS介绍

CAS全称是Compare And Swap,它的实现和它的字面意思一样,先比较后交换,它是CPU硬件层面的一种指令,从CPU层面能保证"比较并更新"这一段操作的原子性。
与synchronized关键字比较不同是synchronized是一种悲观锁,CAS是一种乐观锁。

悲观锁和乐观锁

  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样当第二个线程想拿这个数据的时候,第二个线程会一直堵塞,直到第一个释放锁,他拿到锁后才可以访问。java中的synchronized关键字就是典型的悲观锁思想。
  • 乐观锁:乐观锁概念为每次拿数据的时候都认为别的线程不会修改这个数据,所以不会上锁,但是在更新的时候会判断一下在此期间别的线程有没有修改过数据,乐观锁适用于读操作多的场景。在Java中java.util.concurrent.atomic包下面的原子变量就是使用了乐观锁的一种实现方式CAS实现。

CAS实现原理

CAS有三个操作数,内存值V,旧的预期值A,要修改的更新值B,当A和V相同时将V修改成B,否则一直比较V和的值直至A和V相同为止,使用java代码大致实现逻辑如下:

public class CasDemo {private volatile Integer value;public boolean compareAndSwap(int except, int update) {if (value == except) {this.value = update;return true;}return false;}
}

value使用volatile修饰,保证了该变量的有序性和可见性,compareAndSwap方法两个入参,一个期望值(except),一个更新值(update),先判断value是否和期望值相等,相等则修改为更新值返回true表示修改成功,不相等说明已经被其他线程修改了,返回false修改失败

JDK中的CAS的实现

在JDK中的java.util.concurrent(JUC java并发工具包)就是建立在CAS之上的,我们以并发原子类AtomicInteger为例,先看源码(源码比较多,所以只保留了重点部分)

public class AtomicInteger extends Number implements java.io.Serializable {private static final long serialVersionUID = 6214790243416807050L;// setup to use Unsafe.compareAndSwapInt for updatesprivate static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}private volatile int value;public final int get() {return value;}public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}public final int getAndDecrement() {return unsafe.getAndAddInt(this, valueOffset, -1);}public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}

getAndIncrement(),getAndDecrement()方法分别相当于 i++, i– 的操作,compareAndSet则是上面比较并交换操作,可以看到它们都是调用了Unsafe对象的方法。

再看看Unsafe的部分源码

在这里插入图片描述

可以看到Unsafe类的方法全部是用native修饰的,属于本地方法。
由于Java 方法无法直接访问底层,因此无法直接进行内存操作,所以在jdk中内存操作都封装在sun.misc.Unsafe类里面,Java通过本地方法去操作内存。

再看AtomicInteger的compareAndSet方法,是调用Unsafe的compareAndSwapInt方法

在这里插入图片描述

这里有四个入参,expect和update容易理解,分别是预期值和更新值,valueOffset通过源码可知它是通过Unsafe的objectFieldOffset本地方法返回的一个数值

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

因此,valueOffset大致可以理解为变量value在内存中的地址,Unsafe的compareAndSwapInt方法就是借助C来调用CPU底层,通过valueOffset获取value内存中的值并与expect比较,相同则更新为update返回true,不同则什么都不操作返回false。
java.util.concurrent包下的所有CAS操作都是基于这一系列原子操作.


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

相关文章

CAS算法与ABA问题

锁是用来做并发最简单的方式,当然代价也是最高的。 独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的…

CAS算法-实现原理

目录 CAS是什么? CAS解决了什么问题? CAS存在什么问题? CAS有哪些应用场景? cas的实现 最后 CAS是什么? CAS的全称为Compare and swap 比较并交换。CAS又经常被称为乐观锁,主要的三个变量,内存值…

并发策略-CAS算法

对于并发控制而言,我们平时用的锁(synchronized,Lock)是一种悲观的策略。它总是假设每一次临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时访问临界区资源,就宁可牺牲性…

深入理解CAS算法原理

转载自 深入理解CAS算法原理 1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证…

CAS操作原理

1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一…

CAS原理

一、CAS 1.1 CAS概述和作用 CAS的全称是: Compare And Swap(比较相同再交换)。是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。 CAS的作用:CAS可以将比较和交换转换为原子操作,这个原子操作直接由CPU保证。 CAS可以保证…

CAS算法详解

CAS算法 1、CAS概念: CAS是CompareAndSwap的缩写,中文意思是:比较并替换。当要进行CAS操作时,先比较内存地址和原来预期的 地址比较,如果相同,表示这块内存地址没有被修改,可以用新地址替换&…

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 修改数据数值即可,如下图切换成功