CAS (Compare and swap “比较和交换“) [ Java EE 初阶 ]

embedded/2025/2/28 5:15:19/

目录

什么是 CAS

CAS 是怎么实现的

CAS 有哪些应用

1. 实现原子类

 2. 实现自旋锁

3. CAS 的 ABA 问题


什么是 CAS

// 能够比较和交换某个寄存器中的值和内存中的值, 看是否相等, 如果相等, 则把另一个寄存器中的值和内存中的值进行交换

// CAS伪代码

java">boolean CAS(address, expectValue, swapValue) {if (&address == expectedValue) {&address = swapValue;return true;}return false;
}

// CAS 其实是由一个原子的硬件指令完成的 (原子性)

// 当多个线程同时对某个资源进行 CAS 操作, 只能有一个线程操作成功. 但是并不会阻塞其他线程, 其他线程只会收到操作失败的信号

// CAS 可以视作是一种乐观锁(或者说 CAS 是乐观锁的一种实现方式) 

// 基于CAS 又衍生出一套 "无锁编程"

CAS 是怎么实现的

// 针对不同的操作系统, JVM 用到了不同的 CAS 实现原理, 简而言之 : 是因为硬件给予了支持, 软件层面才能做到

CAS 有哪些应用

1. 实现原子类

// 标准库中提供了 java.util.concurrent.atomic 包, 里面的类都是基于这种方式来实现的.典型的就是Atomiclnteger 类, 其中的 getAndIncrement 相当于 i++ 操作

java">AtomicInteger atomicInteger = new AtomicInteger(0);
// 相当于 i++
atomicInteger.getAndIncrement();

1.1 伪代码实现 

java">class AtomicInteger {private int value;public int getAndIncrement() {int oldValue = value;while ( CAS(value, oldValue, oldValue+1) != true) {oldValue = value;}return oldValue;}
}

 2. 实现自旋锁

// 自旋锁伪代码

java">public class SpinLock {private Thread owner = null;public void lock() {while(!CAS(this.owner, null, Thread.currentThread())) {}}public void unlock() {this.owner = null;}
}

3. CAS 的 ABA 问题

// CAS 关键要点, 是比较 寄存器1 和 内存 的值, 通过这里的是否相等, 来判定 内存的值 是否发生了改变. 如果内存的值变了, 存在其他线程进行了修改; 如果内存的值没变, 没有别的线程修改, 接下来进行的修改就是安全的

// 如果这里的值没变, 就一定没有别的线程修改嘛?

// A-B-A : 另一个线程, 把变量的值从 A -> B, 又从 B -> A , 此时本线程区分不了, 这个值是始终没变, 还是变化又回来了的情况

// 大部分情况下, 就算出现 ABA 问题, 也没啥太大影响, 但是如果遇到一些极端场景下就会出现问题

// 如果约定, 值只能单向变化, 增加一个版本号这个新的属性, 让版本号只能增长不能减小, 只要数据修改, 版本号就一定要增加, 这时我们只需要判定版本号是否相等, 若相等就是数据没有被修改

// 实际开发中, 一般不会直接使用 CAS, 都是用 库里已经封装好的组件(像原子类这种)

  


http://www.ppmy.cn/embedded/167722.html

相关文章

GitHub SSH连接问题解决指南

🔍 GitHub SSH连接问题解决指南 问题描述 遇到错误:ssh: connect to host github.com port 22: Connection refused 说明您的网络环境无法访问GitHub的SSH端口22,常见原因: 防火墙/网络运营商限制(国内常见&#xf…

网络安全 linux学习计划 linux网络安全精要

2.使用命令行 文件系统层次标准(FHS)是一个文件和目录在Unix和Linux操作系统上面应该如何存储的定义。 /bin 重要的二进制可执行程序/boot 与系统启动有关的文件/etc 系统配置文件/home 普通用户家目录/lib 重要的系统库/media 可移动介质的挂载路径/m…

DeepSeek “源神”启动!「GitHub 热点速览」

上周,DeepSeek 官方宣布将陆续发布 5 个开源项目。本周一开源社区就迎来了首发之作——FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升。 GitHub 地址:github.com/deepseek-ai/FlashM…

Selenium按文本查找元素全解析

以下方法基于Python语言实现,适用于最新版Selenium 4.15,建议收藏备用! ‌方法一:XPath文本定位‌ pythonCopy Code # 精确匹配文本(全字符匹配) element driver.find_element(By.XPATH, //*[text()"…

汽车结构胶仿真模型MAT_169材料卡片的制作

随着汽车轻量化技术的发展,车身所用材料呈现出多样化的趋势,由于异种材料之间的物理、化学和力学性能方面存在较大差异,因此多材料轻量化车身对连接技术提出了新的挑战。 传统点焊连接由于技术瓶颈和成本的原因,无法广泛应用于异种…

php 获取head参数

php 获取head参数 在PHP中,获取HTTP头部(head)参数可以通过不同的方式实现,下面为你详细介绍几种常见的方法。 1. 使用$_SERVER超全局变量 $_SERVER 是PHP中的一个超全局变量,它包含了诸如头信息、路径、脚本位置等…

【CI/CD】Jenkinsfile管理+参数化构建+邮件通知以及Jenkins + SonarQube 代码审查

文章目录 一、管理 Jenkinsfile 脚本文件将 Pipeline 脚本放入项目示例:提交代码: Jenkins 引用 Jenkinsfile 二、Jenkins 参数化构建配置参数化构建示例:提交代码: 2. 测试参数化构建 三、配置邮箱服务器发送构建结果安装插件配置…

跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)

飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案: 一、背景痛点与解决方案 在技术文档创作中,数学公式的跨平台渲染一直存在三大痛点: 飞书云文档:原生KaTeX渲染与导出功能存在语法限制微软Word:Math…