CAS(compare and swap)详解,追溯到HOTSPOT源码

自己动手实现CAS CAS cmpxchg 无锁 阅读详情

在这里插入图片描述
问:但是大家有没有想过一个问题就是其他线程修改过后的值与修改之前的值一样,就会出现ABA问题。
答:只需要加个版本号就行,在修改值的时候相应的版本号加一就行,读取比较的时候随带比较以下版本好就行。

问:大家想一下,一个线程在比较N和E,而且N和E相等正准备更新值为V的时候,另外一个线程正好把值改成了H,在预想中这是会出现的,但是为什么没有出现呢?
答:我们可以从AtomicInteger中寻找答案,如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的方法换成上面我们设想的值如下:

public final int getAndAddInt(Object var1, long E, int var4) {
        int N;
        do {
            N = this.getIntVolatile(var1, E);
        } while(!this.compareAndSwapInt(var1, E, N, N + var4));

        return var5;
    }

但是我们在源码中看到compareAndSwapInt方法是一个native方法,所以我们在追到hotspot源码中,如下:
在这里插入图片描述
在unsafe.cpp源码中我们看到最总是调用Atomic的cmpxchg方法来实现的,我们在追到Atomic的cmpxchg方法中,如下:
在这里插入图片描述
asm表示是汇编语言,cmpxchg(compare and exchange)是一条汇编指令,这个表明cas在硬件上就能直接支持的。LOCK_IF_MP是什么意思呢,这个就是我们要寻找的答案,MP(MultiProcessors)表示是多个CPU或者多核。如果是多个CPU或者多核下的情况就会进行加锁。

Java并发编程:CAS原理、应用与面试解析 CAS(Compare-And-Swap)作为并发编程的核心机制,通过CPU原子指令实现无锁线程安全操作,是理解Java内存模型(JMM)和并发控制的重要入口。其原理基于硬件层面的原子操作(如x86的cmpxchg指令)和JMM的happens-before规则,配合volatile变量和内存屏障确保可见性。在Java中,Unsafe类提供的CAS操作是JUC包的基础,广泛应用于AtomicInteger、AQS等并发工具。CAS技术价值在于其高性能的无锁特性,特别适合低竞争场景,相比传统锁机制能显著提升吞 阅读详情

相关推荐

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

Unsafe.compareAndSwapInt()方法解读

代码: /** * Atomically update Java variable to <tt>x</tt> if it is currently * holding <tt>expected</tt>. * @return <tt>true</tt> if successful */ public final nat...

Anakki的博客 2万+

避开这些坑!QMT多因子策略实盘中的5个常见错误及解决方案

本文深入剖析了在QMT平台上实施多因子策略时常见的5个错误,包括因子过拟合、数据延迟处理不当、因子失效、交易成本低估和风险控制缺失,并提供了实用的解决方案。通过优化因子筛选、数据对齐和动态管理,帮助量化交易者提升策略稳健性和实盘表现。

k5l6m的博客 240

Unsafe中偏移量的作用,compareAndSwapInt使用

1.Unsafe是java操作内存的一个非安全类,操作对象和对应的变量来完成CAS操作 1.常用方法compareAndSwapInt是判断当前值与需要更改的值是否一致不一致则进行更改,属于原子操作,其对应的入参描述 compareAndSwapInt(Object var1, long var2, int var4, int var5) 1.var1是传入的对象 2.var2是便宜量,根据偏移量计算哪个值需要更改,一般一个class类默认开头占8个字节,然后每个int会占4个字节,...

止境博客 3419

Autoware1.14-摄像头目标检测YOLO-V3

在Autoware1.14中部署YOLOV3

weixin_43687753的博客 3139

【深度学习面试八股文】-- 1-5

1.样本不平衡的处理方法 ①欠采样 - 随机删除观测数量足够多的类,使得两个类别间的相对比例是显著的。虽然这种方法使用起来非常简单,但很有可能被我们删除了的数据包含着预测类的重要信息。 ②过采样 - 对于不平衡的类别,我们使用拷贝现有样本的方法随机增加观测数量。理想情况下这种方法给了我们足够的样本数,但过采样可能导致过拟合训练数据。 ③合成采样( SMOTE )-该技术要求我们用合成方法得到不平衡类别的观测,该技术与现有的使用最近邻分类方法很类似。问题在于当一个类别的观测数量极度稀少时该怎...

m0_37940804的博客 9940

CAS(Compare-and-Swap)详解

CAS概述 CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题。 volatile不保证原子性问题 根据我前面volatile文章,volatile并不能保证原子性操作,在并发情况下对i++操作,volatile也会发生丢数据的情况,主要是因为线程在对各自的工作非常对数据进行修改后,...

方亚军的博客 2222

PTA编程—币值转换

我对于这个题的主要思想就是把九位数分三块,对每块进行处理后,再合并。有了这个思想就开始写代码,后面就是哪有洞补哪,哪个测试用例没通过就对其特殊处理…。反正最后测试用例全通过了。 #include<iostream> #include <string> #include <algorithm> using namespace std; char a[10]={'a','b','c','d','e','f','g','h','i','j'}; //既然题目说了最多9位

uyo9ko的博客 991

Compare And Swap(CAS)总结

目录一、什么是CAS二、CAS的原理分析三、JDK中对CAS的支持 — Unsafe类四、自旋锁五、CAS的缺点六、CAS的使用场景CAS的全称是Compare-And-Swap,它是一条CPU的原子指令,不会有线程安全问题,CAS是实现并发算法时常用到的一种技术。CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期值(A)和新值(B)。如果内存位置的值与预期值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作,多个线程同时执行CAS

weixiaohuai的博客 4556

100天精通Python(可视化篇)——第80天:matplotlib绘制不同种类炫酷柱状图代码实战(簇状、堆积、横向、百分比、3D柱状图)

0. 专栏导读 1. 普通柱状图 2. 簇状柱形图 3. 堆积柱形图 4. 横向柱状图 5. 横向双向柱状图 6. 百分比堆积柱形图 7. 3D柱形图 8. 3D堆积柱形图 9. 3D百分比堆积柱形图

努力让自己发光,对的人才能迎着光而来 2万+

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

compareAndSwapInt实现

compareAndSwapInt unsafe.compareAndSwapInt(this, valueOffset, expect, update) 接口定义 public final native boolean compareAndSwapInt(Object object, long offset, int expect, int update); unsafe.cpp Unsafe_CompareAndSwapInt UNSAFE_ENTRY(jboolean, Unsafe_Comp

kongkong的专栏 2692

微信对话开放平台智能对话模块的几个亮点

微信AI首席科学家牛成公布了最新开放方案,并重磅宣布全面开放各层次 NLP 能力。具体说来,微信 AI 迈出了“三大步”: 以硬件合作为核心的智言小微硬件开放平台 2.0 正式亮相; 公开以对话开放能力为核心的微信对话开放平台; 全面开放以自然语言处理能力为核心的 NLP 基础技术平台。 参考:微信9年:张小龙指明方向,微信AI全面开放NLP能力 今天公开课上隆重介绍了...

素质云笔记 1万+

深入理解CAS原子操作

CAS是Compare And Swap的缩写,比较与交换,通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值和某个期望值是否相同,如果相同,就给它赋一个新值。}以上伪代码描述了一个由比较和赋值两阶段组成的符合操作。CAS可以看作是他们合并后的整体---一个不可分割的原子操作,并且其原子性是直接在硬件层面得到保障的。CAS可以看作是乐观锁(对比数据库的悲观、乐观锁)的一种实现方式,Java原子类中的递增操作就是通过CAS自旋实现的。

zhangzhigan1202的博客 1750

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java CAS操作的实现原理深度解析与应用案例

详细介绍了CAS的基本概念,以及深入至HotSpot源码级别的实现原理,以及CAS操作的问题。

终生学习践行者 5308

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java中cas实现的探索

1.背景简介 当我们在并发场景下,增加某个integer值的时,就涉及到多线程安全的问题,解决思路两个 将值增加的方法使用同步代码块同步 使用AtomicInteger,来逐步增加其值 这两种实现方式代码如下 import java.util.concurrent.atomic.AtomicInteger; public class CASTest { private static AtomicInteger countAI = new AtomicInteger(0); privat

weixin_45244678的博客 1641

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

高并发系列——CAS操作及CPU底层操作解析

CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。 一、简单实例 一个方法实现i++时,如下面的getAndIncrement1()方法,多线程调用时,会出现并发安全问题。这时,可以通过synchronized关键字显式加锁保证并发安全。 在JAVA并发包中,提供了很多的Atomic原子类,也可以保证线程安全,比如getAndIncrement2()中的Atom

诸葛小猿 1650

并发编程5.CAS

什么是CAS compare and swap 以CAS的方式对属性private int value = 0; 进行递增操作 读取 value 的值 将其赋值给临时变量 a,此时 a = 0; 从a中获取值进行计算,将所得结果赋值给变量b,此时 a = 0; b =1; 重新读取value的值,与a进行比较 如果两个值相等,则将b中的值写入到value中 如果不相等,则从头开始读取value的,赋值给a,计算,再进行读取比较,知道赋值成功为止! graph LR A[读取 value 的值]--&

编码小栈 214

结合Hotspot源码谈谈:为什么CAS的比较和替换操作是原子性的?

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

Torry__的博客 2538

并发编程-深入解析CAS

并发专题 深入解析JVM-类加载机制 深入解析JVM-Java对象头组成 深入JVM内置锁 synchronized 底层 深入理解JMM-Java内存模型 深入理解JMM-volatile原理分析 CAS 无锁机制 CAS: Compare and Swap,翻译成比较并交换 CAS是一种无锁算法,在不使用锁的情况下实现多线程之间的变量同步 CAS 是通过硬件指令,保证原子性 CAS 有三个操作数:内存值V,旧的预期值E,要修改的新值N 仅当预期值E和内存值V相同时,将内存值V修改为N V为内存值

janyxe的博客 283

02.并发多线程-CAS

什么是CAS 全称:Compare and Set ,也就是先比较再设置的意思 也称为:Compare and swap,先比较并交换 (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!) 流程 并发包(j.u.c)下的应用示例 以原子包下的AtomicInteger类进行源码分析CAS //创建一个原子类的对象,并进行++ 操作,从0开始 ...

wanghao112956的博客 226

JVM学习笔记 番外5 CAS

CAS CAS (compare and swap) 比较和替换 value 等于 value2不相等开始读取当前值value使用value做入参进行运算得到result重新获取当前值value2将值更新为result结束 ABA问题 value2 虽然等于 value ,但其实中间有过变化 只是最后结果和当初的结果没有变化而已; 如果业务只关注结果值,可以当做什么也没发生; 如果需要注意这种情况...

晨猫 298

Java 并发编程之 CAS 与 Atomic 原子操作类

比较与交换,是 CPU 硬件层面的原子指令,用于实现无锁同步。核心参数:内存值 V、预期值 E、新值 N。执行逻辑:当且仅当内存值 V == 预期值 E 时,将内存值更新为 N;无论是否更新,均返回原始内存值 V,整个过程原子性由硬件保障。本质:无锁算法(非阻塞同步)、乐观锁的实现方式。

2403_85207115的博客 700

Java并发编程原理精讲:CAS与Atomic原子操作详解

线程1读取内存值A,准备CAS修改;期间线程2将值A改为B,再改回A;线程1比对内存值依旧为A,判定变量未修改,直接执行修改,忽略变量中间篡改流程,即为ABA问题。

只要肯攀登,终有登顶时 350

Java 线程&锁(一)

摘要: 锁的本质是什么 CAS如何实现?如何处理 ABA 问题 互斥锁:同一时刻,只能有一个线程持有锁 原始的线程通讯 -> o.wait(); o.notify(); 在调用 o.wait(); 时,线程会进入等待队列; CAS CAS = compareAndSet/compareAndSwap - 自旋锁: 失败时候重试 自旋锁引发的 ABA 问题: int m = 0; // 线程①取 m 值运算,经过运算后将 m 更新为 1, 更新之前会判断 m 是否仍然为 0, 如果为0, 则将 .

PitBXu的博客 3086

Java并发编程中的CAS原理与应用实践

CAS(Compare-And-Swap)是一种基础的原子操作指令,广泛应用于并发编程中。其核心原理是通过硬件支持的原子指令(如x86的CMPXCHG)实现无锁同步,包含内存位置、预期值和新值三个操作数。从Java内存模型(JMM)角度看,CAS同时具备volatile读写的内存语义,保证了操作的原子性和可见性。在Java并发包中,Atomic原子类、ConcurrentHashMap等高性能并发工具都基于CAS实现。典型应用场景包括计数器递增、状态标志更新等低竞争操作,相比传统锁机制能显著提升吞吐量(如金

weixin_33744141的博客 391
上一篇: Java中的泛型
下一篇: synchronized的锁升级过程和详细的代码演示
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值