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

news/2025/2/27 6:14:14

目录

什么是 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.niftyadmin.cn/n/5869619.html

相关文章

微信小程序数据缓存与本地存储:优化用户体验

在前几篇文章中,我们学习了微信小程序的基础知识、数据绑定、事件处理、页面导航与路由、网络请求与API调用以及组件封装与复用。这些知识帮助我们构建了具备基本功能的小程序。然而,在实际开发中,如何高效地管理数据、提升用户体验是一个重要课题。本文将深入探讨微信小程序…

大白话css第一章基础入门

大白话css第一章基础入门 了解CSS基本概念 CSS是干啥的:就好比你装修房子,HTML呢是把房子的框架、房间布局都搭好了,像客厅、卧室、厨房都有了,但是房子里面空空的,啥都没装饰。这时候CSS就上场啦,它就是…

【Win10】Anaconda + Pycharm 环境搭建教程

一、 Anaconda 安装包下载 1. Anaconda官方 https://www.anaconda.com/ 下载较慢, 页面直观 2. 清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 二、 Pycharm 安装包下载 https://www.jetbrains.com/pycharm/ 进入官网后,点击此处的Do…

Pytorch实现之脑电波图像生成

简介 简介:采用双GAN模型架构来生成脑电波与目标图像。 论文题目:Image Generation from Brainwaves using Dual Generative Adversarial Training(使用双生成对抗训练的脑电波图像生成) 会议:IEEE Global Conference on Consumer Electronics (GCCE) 摘要:表示通过无…

数据存储:一文掌握存储数据到mysql的详细使用

文章目录 一、环境准备1.1 安装MySQL数据库1.2 安装Python MySQL驱动 二、连接到MySQL数据库三、执行基本的CRUD操作3.1 创建(Create):插入数据3.2 读取(Read):查询数据3.3 更新(Update&#xf…

FPGA开发时序图绘制

开始的时候画时序图都是拿 visio 硬连,但是那个线宽太难统一了,丑不拉几的,遂学习 waveform 语法使用代码来画时序图。 开始 Vscode 中安装 waveform render 或者在 GitHub 搜索 wavedrom 安装即可。由于 vscode 是我常用的编辑器&#xff…

将pcap数据包的packet转成文本的几种方法

本文将介绍一下通过手动和自动化的方法将pcap数据包的packet导出为hex dump,json这两种形式。 有多种形式的文本格式可以用来用来表示pcap数据内容,例如K12, base64,hex dump,json,csv。但是应用最为广泛的形式为hex …

HarmonyOS学习第8天: 按钮组件为应用添加交互的入口

一、引言:按钮 —— 交互的起点 在 HarmonyOS 应用开发的广阔天地中,按钮组件(Button)宛如一座沟通用户与应用程序的桥梁,是实现交互的关键入口。当我们在手机上使用各类应用时,无论是点击 “登录” 开启个…