当前位置: 首页 > news >正文

CAS(Compare And Swap)

CAS核心原理

操作流程

CAS 包含三个参数:内存值(V)预期值(E)和新值(N)。执行步骤如下:

  • 比较:检查当前内存值 V 是否等于预期值 E。

  • 交换:如果相等,将内存值更新为新值 N;否则不操作。

  • 返回结果:返回操作是否成功(或当前实际值)。整个过程是原子性的,由 CPU 指令直接保证,例如 Intel 的 cmpxchg 指令。

    AtomicInteger atomicInt = new AtomicInteger(5);
    boolean success = atomicInt.compareAndSet(5, 10); // 若当前值为5,则更新为10
    //若 atomicInt 的当前值未被其他线程修改,则更新成功(返回 true),否则失败(返回false)
    

原子性保障

CPU 通过两种机制保证 CAS 的原子性:

总线锁定

  • 使用 LOCK# 信号锁定总线,阻止其他 CPU 访问内存,确保当前操作独占执行。
  • 缺点:锁定期间其他 CPU 无法操作内存,性能开销大

缓存锁定

  • 仅锁定缓存行(CPU 高速缓存的最小单位),通过 缓存一致性协议(如 MESI)检测共享变量是否被修改。
  • 优势:缩小锁定范围,减少阻塞,现代 CPU 普遍采用此方式。

应用场景

原子类Atomic

//Java 的 AtomicInteger、AtomicReference 等类通过 CAS 实现线程安全的原子操作。
public final int incrementAndGet() {for (;;) {int current = get();           // 当前值int next = current + 1;        // 新值if (compareAndSet(current, next)) return next;               // 更新成功则返回}
}
//自旋循环中不断尝试 CAS,直到成功。

并发容器

  • ConcurrentHashMap:初始化数组时通过 sizeCtl 变量和 CAS 确保只有一个线程执行初始化,其他线程自旋等待或调用 Thread.yield() 让出 CPU
  • ConcurrentLinkedQueue:无锁队列通过 CAS 实现入队和出队的线程安全

自旋锁和无锁算法

//自旋锁:线程通过循环尝试 CAS 获取锁,避免阻塞和上下文切换。例如:
while (!lock.compareAndSet(0, 1)) { /* 自旋 */ }
//非阻塞数据结构:如无锁栈、队列等,依赖 CAS 实现并发安全

优缺点

在这里插入图片描述

ABA问题和解决方案

问题描述

  • 线程 1 读取值 A,线程 2 将 A→B→A,线程 1 的 CAS 仍会成功,导致逻辑错误(例如链表头节点被意外删除)

解决方案

//版本号机制:每次更新递增版本号,检查值的同时检查版本号。
//AtomicStampedReference:Java 提供带版本号的原子类。
AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(100, 1);
ref.compareAndSet(100, 200, 1, 2); // 版本号从1→2
```[2](@ref) [4](@ref)

java中的cas实现

  1. Unsafe类:CAS 操作通过 Unsafe 类调用本地方法(如 compareAndSwapInt),直接操作内存地址
  2. 底层指令映射:JVM 将 compareAndSet 映射为 CPU 的 cmpxchg 指令,确保原子性

总结

  • CAS 是一种高效的无锁并发控制机制,适用于计数器、轻量级锁等场景。其核心优势是避免线程阻塞,但需注意 ABA 问题和自旋开销。在高并发系统中,CAS 常与退让策略(指数退避)(如 Thread.yield())结合,平衡性能与资源消耗
    • 指数退避:指数退避是一种动态调整重试延迟时间的算法,旨在通过指数级增长的等待时间和随机抖动减少系统资源竞争或网络冲突,提升系统的稳定性和效率。其核心思想是:在每次尝试失败后,延迟时间成倍增加,从而避免因频繁重试导致的资源过载或冲突加剧。
    • 核心原理:延迟时间指数增长、随机抖动、最大延迟限制
      • 延迟时间指数增长:初始设定一个最小延迟(如 100ms),每次失败后延迟时间按指数倍数(如 2 倍)增长。例如:第 1 次重试延迟 100ms,第 2 次 200ms,第 3 次 400ms,依此类推。
      • 随机抖动(Jitter):在延迟时间中加入随机值(如 0~100ms),防止多个请求在同一时间点集中重试,避免“雪崩效应”
        200ms,第 3 次 400ms,依此类推。
      • 随机抖动(Jitter):在延迟时间中加入随机值(如 0~100ms),防止多个请求在同一时间点集中重试,避免“雪崩效应”
      • 最大延迟限制:设置上限(如 30 秒),防止无限等待

相关文章:

CAS(Compare And Swap)

CAS核心原理 操作流程 CAS 包含三个参数&#xff1a;内存值&#xff08;V&#xff09;、预期值&#xff08;E&#xff09;和新值&#xff08;N&#xff09;。执行步骤如下&#xff1a; 比较&#xff1a;检查当前内存值 V 是否等于预期值 E。 交换&#xff1a;如果相等&#…...

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…...

Deepseek API+Python 测试用例一键生成与导出 V1.0.4 (接口文档生成接口测试用例保姆级教程)

接口文档生成接口测试用例保姆级教程 随着测试需求的复杂性增加,测试用例的设计和生成变得愈发重要。Deepseek API+Python 测试用例生成工具在 V1.0.4 中进行了全方位的优化和功能扩展,特别是对接口测试用例设计的支持和接口文档的智能解析处理。本文将详细介绍 V1.0.4 版本…...

git 基本操作命令

一、初始化本地git仓库 git init 二、将当前目录下所有文件加载到本地git仓库 git add .三、提交内容和备注 git commit -m 提交类容四、(复制仓库路径)然后提交到仓库 git remote add origin 提交的仓库路径五、提交到远程仓库&#xff0c;如果这里提交失败&#xff0c;在…...

学习本地部署DeepSeek的过程(基于LM Studio)

除了使用Ollama部署DeepSeek&#xff0c;还可以使用LM Studio部署DeepSeek&#xff0c;后者是一款允许用户在本地计算机上运行大型语言模型&#xff08;LLMs&#xff09;的桌面应用程序&#xff0c;旨在简化本地模型的使用&#xff0c;无需云端连接或复杂配置即可体验 AI 功能。…...

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程) 一、获取网页数据请求流程 二、目标网址、cookie生成(逐步分析) 1、目标网址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通过脚本监听、hook_cookie等操作可…...

游戏引擎学习第180天

我们将在某个时候替换C标准库函数 今天我们要进行的工作是替换C标准库函数&#xff0c;这是因为目前我们仍然在使用C语言开发&#xff0c;并且在某些情况下会调用C标准库函数&#xff0c;例如一些数学函数和字符串格式化函数&#xff0c;尤其是在调试系统中&#xff0c;我们使…...

测试用例生成平台通过大模型升级查询功能,生成智能测试用例

在测试工作中&#xff0c;查询功能是各类系统的核心模块&#xff0c;传统的测试用例编写往往耗时且重复。如何让老旧平台焕发新活力&#xff1f;本文将结合大模型技术&#xff0c;通过用户输入的字段信息&#xff0c;自动化生成高效、精准的测试用例。同时&#xff0c;我们还将…...

kafka零拷贝技术的底层实现

什么是 Sendfile&#xff1f; sendfile 是一种操作系统提供的系统调用&#xff08;system call&#xff09;&#xff0c;用于在两个文件描述符&#xff08;file descriptor&#xff09;之间高效传输数据。它最初由 Linux 内核引入&#xff08;从 2.1 版本开始&#xff09;&…...

Win11+VS2022+CGAL5.6配置

1. CGAL库简介 CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个开源的计算几何算法库&#xff0c;主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法&#xff0c;覆盖点、线、多边形、曲面等基本几何对象的表示与操…...

Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接

一、gcc/g基础认知 在Linux开发环境中&#xff0c;gcc和g是我们最常用的编译器工具&#xff1a; gcc&#xff1a;GNU C Compiler&#xff0c;专门用于编译C语言程序g&#xff1a;GNU C Compiler&#xff0c;用于编译C程序&#xff08;也可编译C语言&#xff09; &#x1f4cc…...

Vue3项目中的.vscode文件夹

.vscode 文件夹主要用于存放与 Visual Studio Code&#xff08;VS Code&#xff09;编辑器相关的项目配置文件&#xff0c;这些文件能让项目在 VS Code 里的开发体验更加个性化和高效。 extensions.json 在 .vscode 文件夹中&#xff0c;extensions.json 文件的作用是列出项目…...

蓝桥杯嵌入式十六届模拟三

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...

造成服务器网络连接不稳定的原因是什么?

服务器的稳定性会影响到网络的响应速度和用户的体验感&#xff0c;当服务器网络连接不稳定时&#xff0c;会到时用户在浏览网站的过程中出现页面卡顿或页面消失等情况&#xff0c;给企业造成一定的经济损失&#xff0c;本文就来介绍一下造成服务器网络连接不稳定的因素都有哪些…...

[FPGA基础学习]加法器、三八译码器及DE2-115基本使用方法和数码管显示

软件安装&#xff1a;QuartusLite安装说明及驱动更新 DE2-115上电及程序烧录 1.用包装盒里的USB 电缆将PC的USB端口和DE2-115开发板的USB Blaster连接器连接 起来&#xff0c;为了实现主机和开发板之间的通讯&#xff0c;必须安装USB Blaster 驱动软件 鼠标右击“USB-Blaster…...

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…...

树状数组 3 :区间修改,区间查询

【题目描述】 这是一道模板题。 给定数列 a[1],a[2],…,a[n]&#xff0c;你需要依次进行q个操作&#xff0c;操作有两类&#xff1a; 1lrx&#xff1a;给定 l,r,x对于所有 i∈[l,r]&#xff0c;将a[i]加上x&#xff08;换言之&#xff0c;将 a[l],a[l1],…a[r] 分别加上 x&a…...

C++的IO流

1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓…...

QLoRA和LoRA 微调

QLoRA 其实是一种结合了量化和 LoRA 微调技术的统一方法&#xff0c;而不是同时使用两种不同的微调方式。换句话说&#xff0c;QLoRA 的意思就是&#xff1a;先把大模型的主权重用低精度&#xff08;例如 4-bit&#xff09;量化&#xff0c;从而大幅减少存储需求&#xff1b;然…...

Android电话监听器的设计与实现:深入解析Service与TelephonyManager

目录 一、引言 二、Service核心机制解析 1. Service的本质特性 2. 生命周期管理 3. 服务类型全景 三、Service实战开发 1. 启动式Service开发&#xff08;lesson1&#xff09; 2. 绑定式Service开发 四、电话监听器完整实现&#xff08;lesson3&#xff09; 1. 系统架…...

java学习笔记7——面向对象

关键字&#xff1a;static 类变量 静态变量的内存解析&#xff1a; 相关代码&#xff1a; public class ChineseTest {public static void main(String[] args) {System.out.println(Chinese.nation); //null 没赋值前System.out.println(Chinese.nation); //中国 静态变量赋值…...

java学习——函数式编程(1)

函数式编程 Java 的函数式编程是一种以函数为核心构建逻辑的编程范式,强调不可变性、声明式代码和无副作用的操作。它通过Lambda表达式、函数式接口(如Function、Predicate、Consumer等)和Stream API等特性实现,将计算过程抽象为函数的组合与转换,而非传统的命令式步骤。…...

java 批量下载doc\excle\pdf

指定图片集合 下载到指定文件夹 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.List;public class OfficeFileDownloader {/*** 需要下载的Office文档URL列表*/private static final List<Strin…...

Python爬虫:Feapder 的详细使用和案例

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Feapder 概述1.1 Feapder介绍1.2 Feapder 核心特点1.3 Feapder 主要组件1.4 Feapder的安装2. 基础爬虫编写2.1 创建爬虫2.2 运行爬虫3. 数据采集案例3.1 新闻网站采集3.2 电商商品采集3.3 使用 Spider 类创建更强大爬…...

【江协科技STM32】读写备份寄存器RTC实时时钟(学习笔记)

参考相关文章理解&#xff1a; 【江协科技STM32】Unix时间戳&#xff08;学习笔记&#xff09;-CSDN博客 【江协科技STM32】BKP备寄存器&RTC实时时钟&#xff08;学习笔记&#xff09;_stm32断电保存时钟-CSDN博客 读写备份寄存器 接线图&#xff1a;VBAT是从STLINK的…...

Linux touch命令

参考资料 Linux 常用命令 - touch 【创建空文件与修改时间戳】 目录 一. 用法简介二. 配合扩展字符&#xff0c;批量创建文件三. 修改文件的时间戳3.1 -t 配置项3.2 -d 配置项3.3 配合find命令实现批量时间戳修改 四. 结合 find 批量创建相同时间的新文件 一. 用法简介 ⏹当指…...

PyTorch图像预处理--Compose

torchvision.transforms.Compose 是 PyTorch 中用于图像预处理的核心工具&#xff0c;可将多个图像变换操作组合成一个顺序执行的流水线。 ‌1. 定义与作用‌ ‌功能‌&#xff1a;将多个图像处理步骤&#xff08;如缩放、裁剪、归一化等&#xff09;串联为一个整体&#xff…...

CSP历年题解

CSP历年题解 csp历年题解&#xff0c;csp.cpp内容涵盖从2023年12月开始一直持续到第一次认证的所有前4题。所有的题解均为满分&#xff0c;在其中&#xff0c;有四道题非本人编写&#xff0c;而从网上搜集优质解答&#xff0c;并且已在文中附上了来源链接。其余则为自己编写&a…...

《索引江湖:B树索引与哈希索引的风云对决》

在数据库的神秘世界里&#xff0c;索引宛如一把把神奇的钥匙&#xff0c;帮助我们在海量数据中快速找到所需信息。而B树索引与哈希索引&#xff0c;则是其中两把最为耀眼的利刃&#xff0c;各自凭借独特的“武功秘籍”&#xff0c;在不同的应用场景中大放异彩。今天&#xff0c…...

java八股文之JVM

1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”&#xff0c;记录每个线程当前执行的指令位置&#xff0c;确保程序流程的连续性和线程切换的准确性。线程私有的&#xff0c;每个线程一份&#xff0c;内部保存的字节码的行号。用于记录正在执行的字节码指令的地…...

学习爬虫的第二天——分页爬取并存入表中

阅读提示&#xff1a;我现在还在尝试爬静态页面 一、分页爬取模式 以豆瓣Top250为例&#xff1a; 基础url:豆瓣电影 Top 250https://movie.douban.com/top250 分页参数:?start0&#xff08;第一页&#xff09;、?start25&#xff08;第二页&#xff09;等 每页显示25条数…...

Ubuntu与Windows之间相互复制粘贴的方法

一、打开Ubuntu终端 二、卸载已有的工具 sudo apt-get autoremove open-vm-tools 三、安装工具 sudo apt-get install open-vm-tools-desktop 四、重启 直接输入reboot 注&#xff1a;有任何问题欢迎评论区交流讨论或者私信&#xff01;...

docker安装hyperf环境,连接本机redis问题处理

错误信息显示“Connection refused”&#xff0c;这通常说明 Docker 容器内的 Hyperf 项目无法连接到你本机的 Redis 服务。 1. 容器内的 127.0.0.1 指向问题 在 Docker 容器中&#xff0c;127.0.0.1 指的是容器本身&#xff0c;而不是宿主机&#xff08;你的 Mac&#xff09;…...

第12章:优化并发_《C++性能优化指南》notes

优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案&#xff1a; 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别&#xff1a;std::thread直接管理线程&#xf…...

Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)

上篇文章&#xff1a;Linux操作系统7- 线程同步与互斥6&#xff08;POSIX信号量与环形队列生产者消费者模型&#xff09;-CSDN博客 本篇代码仓库&#xff1a;myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…...

学有所记——初探向量数据库Weaviate

目标&#xff1a; 了解向量数据库的连接、建库、插入数据、查询数据等基本用法以及关于语义相似度的一些基本概念。 背景&#xff1a; 前段时间尝试在自己的电脑上搭建OllamaDify平台&#xff0c;体验并探索大模型的强大功能。在使用过程中&#xff0c;尤其是在搭建RAG知识库…...

Ardupilot开源无人机之Geek SDK进展2025Q2

Ardupilot开源无人机之Geek SDK进展2025Q2 1. 源由2. 内容汇总2.1 【jetson-fpv】“Caution - Hot surface. Dont touch.”2.2 【jetson-fpv】1080P/720P显示设备配置 3. 遗留问题3.1 高优先级3.1.1 【jetson-fpv】1080P60FPS AI分析视频卡顿&#xff0c;丢包3.1.2 【jetson-fp…...

深入理解K8s与Docker的关系:容器化技术的双雄

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台gpt-4-turbo模型生成&#xff0c;仅供参考。 在现代云计算及微服务架构的发展中&#xff0c;Docker与Kubernetes&#xff08;K8s&#xff09;作为两大核心技术&#xff0c;被广泛…...

QT高效文件I/O编程--实用指南与最佳实践

概述 在软件开发过程中,文件输入输出(I/O)操作是数据持久化和交换的核心部分。无论是简单的日志记录还是复杂的数据集处理,高效的文件I/O操作对于应用的整体性能至关重要 最佳实践 一、选择合适的文件模式 正确选择文件打开模式是确保操作意图明确且安全的第一步。不同…...

QT记事本

记事本应用程序提供了基本的文本编辑功能&#xff0c;支持文件的新建、打开、保存和另存为操作&#xff0c;同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp&#xff1a;程序的入口点&#xff0c;负责初…...

【leetcode hot 100 84】柱状图中最大的矩形

解法一&#xff1a;单调栈 class Solution {public int largestRectangleArea(int[] heights) {int len heights.length;int area 0;// 先做一些特殊判断if(len0){return 0;}if(len1){return heights[0];}// 进入栈后发现后面更短&#xff0c;可以得到当前这个能勾勒的面积 …...

Spring----ioc

1.Spring 是什么&#xff1f; 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的话来概括Spring, 那就…...

C++——重载

目录 一、函数重载 基本概念 函数重载的条件 编程示例 代码讲解 函数重载的注意事项 二、运算符重载 什么是运算符重载&#xff1f; 运算符重载的实质是什么&#xff1f; 运算符重载函数的写法 运算符重载的基本语法 可重载的运算符列表 基本原则 编程示例 代码解…...

答疑解惑:EMC VMAX3 MMCS控制台不定期重启原因分析

今天有个朋友咨询他们有一台EMC的VMAX100k设备&#xff0c;其中MMCS2的管理控制台定期重启&#xff0c;但始终无法找到重启原因&#xff0c;稍微花了点时间&#xff0c;帮客户看了下。先说结论&#xff0c;MMCS2确实不定期发生重启&#xff0c;每次reboot都是一样的message信息…...

单例模式(Singleton Pattern)

单例模式&#xff08;Singleton Pattern&#xff09; 任务管理器可以作为一个全局的任务配置管理类&#xff0c;使用单例模式保证全局只有一个实例。这样你可以避免在应用程序中创建多个任务管理对象&#xff0c;保持配置参数的统一。 示例&#xff1a; class TaskManager { …...

树莓派超全系列文档--(8)RaspberryOS实用程序

RaspberryOS实用程序 实用程序kmsprintvclogvcgencmdvcosversionget_throttledmeasure_tempmeasure_clock [clock]measure_volts [block]otp_dumpget_config [configuration item|int|str]get_mem typecodec_enabled [type]mem_oommem_reloc_statsread_ring_osc 文章来源&#…...

Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践

引言 在短视频、直播、影视制作等领域&#xff0c;视频水印是一种常见的工具&#xff0c;用于保护版权、提升品牌辨识度或满足合规性要求。然而&#xff0c;开发者在实现水印添加时往往面临以下挑战&#xff1a; 手动处理效率低&#xff1a;使用图像编辑软件&#xff08;如 P…...

绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好&#xff0c;今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下&#xff0c;即使没有公网IP&#xff0c;你也能随时随地远程访问自己…...

如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?

大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载&#xff1f; 在 React 项目里&#xff0c;有时候组件功能多、体积大&#xff0c;要是一次性把所有组件都加载进来&#xff0c;网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...

虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战

目录 系列文章 1. 引言 2 技术栈Request 2.1请求头headers 2.2查找定位信息 2.3处理网页html结构化数据 2.4每页url规律 2.5逐条查找所需信息 2.6完整代码 3 数据存储至mysql 3.1新建数据库 3.2编写数据库写入py文件 3.2.1构建1个执行sql语句的函数 3.2.2构造一个…...