CAS机制是什么?

article/2025/9/29 15:31:16

首先我们需要了解为什么有CAS机制的存在?那我们就不得不先知道互斥同步和非阻塞同步。

互斥同步

互斥同步面临的主要问题是进行线程阻塞和唤醒带来的性能开销,因此这种同步也叫阻塞同步。互斥同步属于悲观的并发策略,其总是认为只要不做同步措施(加锁),就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会加锁,将会导致用户态到内核态转换、维护锁计时器和检查是否有被阻塞的线程需要被唤醒等开销。

非阻塞同步

基于冲突检测的乐观并发策略,通俗的说就是不管风险,先进行操作。如果没有线程争用共享资源,那就直接操作成功;如果存在线程争用共享资源,,那就进行补偿措施,最常用的补偿措施是不断的重试,直到出现没有竞争为止。这种方式不需要把线程阻塞,因此也叫无锁编程。

非阻塞同步要求操作和冲突检测这两步具备原子性。如果在使用互斥同步来保证就失去了意义,所以我们只能靠硬件来实现这件事,硬件保证某些语义看起来需要多次操作的行为可以只通过一条处理器指令就能完成。在java里用到的是CAS(Compare-And-Swap)操作,比较并交换。

CAS指令需要三个操作数,分别是内存地址V、旧预期值A、准备设置的新值B。

CAS指令执行更新一个变量的时候,只有当旧预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。这样的一个过程属于原子操作(依赖硬件),执行期间不会被其他线程打断。

java中的“原子操作类”就用到了“CAS机制”。

所谓原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。如AtomicBoolean,AtomicInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型的原子性操作。

在这用AtomicInteger来进行举例说明CAS

有这样一段代码没有加任何同步锁,创建20个线程,每个线程对number进行10000次自增1,最后number的结果总是200000,说明了AtomicInteger是原子操作类

public class Test {static AtomicInteger number = new AtomicInteger(0);public static void main(String[] args) {Thread[] threads = new Thread[20];for (int i = 0; i < 20; i++) {threads[i] = new Thread(new Runnable() {@Overridepublic void run() {//每个线程对number进行10000次自增for (int i = 0; i < 10000; i++) {number.incrementAndGet();//自增1}}});threads[i].start();}//等待所有累加线程都结束while (Thread.activeCount() > 2) {Thread.yield();}System.out.println(number);}
}

这一切都要归功于 incrementAndGet()方法

JDK中 incrementAndGet()源码如下

public final int incrementAndGet(){for(;;){int current = get();//旧值Aint next = current+1;//新值B//比较if(compareAndSet(current,next))return next;}
}

 incrementAndGet()方法在一个无线循环中,不断尝试将一个比当前值大一的的新值赋值给自己。如果失败,那说明在执行CAS操作时,旧值已经发生改变,于是再次循环进行下一次操作,直到设置成功。

下面我们用2个线程的操作来进行具体解释这一过程:

1.在变量地址V中存放着20

 2.此时线程一要将变量的值修改为21,旧值A=20与地址V中的值进行比较发现相等,说明没有其他线程对变量进行修改,可以直接将地址V中的值改为21。

 3.此时线程二要将变量的值修改为21,旧值A=20与地址V中的值进行比较发现不相等,说明有其他线程对变量进行了修改,所以不能地址V中的值改为21。

 4.线程二进入下一次循环,旧值=21,新值=22。旧值A=21与地址V中的值进行比较发现相等,说明没有其他线程对变量进行修改,可以直接将地址V中的值改为22。

5.最终结果


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

相关文章

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/…

使用Armitage进行渗透测试与键盘记录

0x00&#xff1a;Armitage是一款基于GUI开发的图形化渗透工具&#xff0c;对于渗透测试而言能够快速了解网络的拓扑以及主机状态&#xff0c;其功能丰富&#xff0c;是每一位渗透测试者的必备武器&#xff1b;今天我就来演示如何在Armitage下入侵纯在漏洞的XP系统&#xff0c;废…