如果面试官问你CAS,你还这么答,可能就要回去等通知了

Claude Code与Vibe Coding:2026年AI编程实战指南 AI编程助手是基于大语言模型的智能代码生成工具,通过理解编程上下文提供精准的代码补全和重构建议。其核心原理是利用深度学习技术分析代码语义,将自然语言指令转化为可执行代码。这种技术能显著提升开发效率,减少重复性编码工作,特别适用于快速原型开发和复杂问题求解。在实际应用场景中,AI编程助手可与Vibe Coding方法论结合,建立流畅的人机协作工作流。Claude Code作为先进的AI编程工具,支持多语言开发和智能错误检测,而Vibe Coding则强调自然交互和迭代优化,两者协同为开发者提供完整的AI编程解 阅读详情

前言

大家好,我是JAVA高级开发之路,一个总在为粉丝解决面试题的程序员。

最近有几个粉丝说在面试面试中遇到了CAS的问题,连着几次面试都没有让面试官满意,区区CAS底层源码,怎能难倒咱们这届程序员们呢?都支棱起来,跟我一起来搞定CAS底层源码。

什么是CAS

CAS的全称是Compare-And-Swap,它是CPU并发原语。

它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的

CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统应用范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题,也就是说CAS是线程安全的。

我们来先看下这个代码:

如果面试官问你CAS,你还这么答,可能就要回去等通知了

如果面试官问你CAS,你还这么答,可能就要回去等通知了

大家猜一下结果是什么?

第二次打印会不会被赋值为 9999

上面代码的执行结果为:

如果面试官问你CAS,你还这么答,可能就要回去等通知了

​

如果面试官问你CAS,你还这么答,可能就要回去等通知了

那么为什么回事这样的结果?我们一起来看看中间的原理

这是因为我们执行第一个的时候,期望值和原本值是满足的,因此修改成功,但是第二次后,主内存的值已经修改成了6666,不满足期望值,因此返回了false,本次写入失败

如果面试官问你CAS,你还这么答,可能就要回去等通知了

​

如果面试官问你CAS,你还这么答,可能就要回去等通知了

这个就像是git的版本号一样,如果没有更改那么就可以提交,否则先把以前的pull下来合并之后再去提交;

CAS的底层原理

首先我们先看看 
atomicInteger.getAndIncrement()方法的源码

如果面试官问你CAS,你还这么答,可能就要回去等通知了

​

如果面试官问你CAS,你还这么答,可能就要回去等通知了

在这里细心的读者就发现了底层调用了一共unsafe类的getAndAddAInt方法。

我们去看看unsafee方法

如果面试官问你CAS,你还这么答,可能就要回去等通知了

​

如果面试官问你CAS,你还这么答,可能就要回去等通知了

Unsafe是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(Native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定的内存数据。Unsafe类存在sun.misc包中,其内部方法操作可以像C的指针一样直接操作内存,因为Java中的CAS操作的执行依赖于Unsafe类的方法。

注意Unsafe类的所有方法都是native修饰的,也就是说unsafe类中的方法都直接调用操作系统底层资源执行相应的任务。

为什么Atomic修饰的包装类,能够保证原子性,依靠的就是底层的unsafe类。

如果面试官问你CAS,你还这么答,可能就要回去等通知了

​

如果面试官问你CAS,你还这么答,可能就要回去等通知了

var5:就是我们从主内存中拷贝到工作内存中的值

那么操作的时候,需要比较工作内存中的值,和主内存中的值进行比较

假设执行 compareAndSwapInt返回false,那么就一直执行 while方法,直到期望的值和真实值一样

  • 如果相同,更新var5 + var4 并返回true
  • 如果不同,继续取值然后再比较,直到更新完成

  • val1:AtomicInteger对象本身
  • var2:该对象值得引用地址
  • var4:需要变动的数量
  • var5:用var1和var2找到的内存中的真实值用该对象当前的值与var5比较

这里没有用synchronized,而用CAS,这样提高了并发性,也能够实现一致性,是因为每个线程进来后,进入的do while循环,然后不断的获取内存中的值,判断是否为最新,然后在进行更新操作。

假设线程A和线程B同时执行getAndInt操作(分别跑在不同的CPU上)

1. AtomicInteger里面的value原始值为3,即主内存中AtomicInteger的 value 为3,根据JMM模型,线程A和线程B各自持有一份价值为3的副本,分别存储在各自的工作内存

2. 线程A通过getIntVolatile(var1 , var2) 拿到value值3,这是线程A被挂起(该线程失去CPU执行权)

3. 线程B也通过getIntVolatile(var1, var2)方法获取到value值也是3,此时刚好线程B没有被挂起,并执行了compareAndSwapInt方法,比较内存的值也是3,成功修改内存值为4,线程B打完收工,一切OK

4. 这是线程A恢复,执行CAS方法,比较发现自己手里的数字3和主内存中的数字4不一致,说明该值已经被其它线程抢先一步修改过了,那么A线程本次修改失败,只能够重新读取后在来一遍了,也就是在执行do while。

5. 线程A重新获取value值,因为变量value被volatile修饰,所以其它线程对它的修改,线程A总能够看到,线程A继续执行compareAndSwapInt进行比较替换,直到成功。

Unsafe类 + CAS思想:也就是自旋,自我旋转。

底层汇编

Unsafe类中的compareAndSwapInt是一个本地方法,该方法的实现位于unsafe.cpp中

  • 先想办法拿到变量value在内存中的地址
  • 通过Atomic::cmpxchg实现比较替换,其中参数X是即将更新的值,参数e是原内存的值

CAS缺点

CAS不加锁,保证一次性,但是需要多次比较

  • 但是对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候只能用锁来保证原子性

  • 循环时间长,开销大(因为执行的是do while,如果比较不成功一直在循环,最差的情况,就是某个线程一直取到的值和预期值都不一样,这样就会无限循环)
  • 只能保证一个共享变量的原子操作当对一个共享变量执行操作时,我们可以通过循环CAS的方式来保证原子操作
  • 引出来ABA问题?

ABA问题

总结

CAS

CAS是compareAndSwap,比较当前工作内存中的值和主物理内存中的值,如果相同则执行规定操作,否者继续比较直到主内存和工作内存的值一致为止

CAS应用

CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则不操作

对此,你有什么要补充的吗?欢迎在评论区留言。

写在最后

现在很多程序员们面试都是靠背面试题,这个只能适用于基础面,如果想要去大厂的话,一定要把钻研深度,这样才能在众多面试者中脱颖而出。

随着金九银十的结束,也有很多粉丝私聊小编,说自己拿到了大厂offer,同时小编再三请求下才让他们整理出了这份最新的互联网大厂面经,

如果面试官问你CAS,你还这么答,可能就要回去等通知了

领取方式:点赞+收藏后,后台私聊小编:面经,即可免费领取

​
最后祝大家升职加薪,给个点赞+收藏,我们下次再见!

snipersim安装 snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。 阅读详情

相关推荐

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2218

CAS底层原理

概念 CAS的全称是Compare-And-Swap,它是CPU并发原语 它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的 CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统应用范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行

jassyzhen的博客 290

ros1 ubuntu22.04 安装教程

ROS1 ubuntu22.04 安装教程

autolabor的博客 9197

CAS原理分析,解决银行转账ABA难题

来源:https://ddnd.cn/2019/03/13/java-cas/什么是CASCAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内...

架构师小秘圈 542

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 494

java并发编程实战笔记(第二章)

2.1 什么是线程安全性 1)在方法计算过程中的临时状态仅存在于线程栈上的局部变量中,并且只能由正在执行的线程访问。由于线程访问无状态对象的行为并不会影响其他线程中操作的正确性,因此无状态对象时线程安全的。无状态对象一定是线程安全的。 2.2 原子性 @NotThreadSafe public class UnsafeCountingFactorizer implemnets Servlet{ private long count = 0; public long getCount(){ retur

joeyin 1255

RK3568平台(USB篇)USB HUB集线器

hub,集线器,连接在host与device之间的一种用于usb接口扩展的usb设备。可以将一个usb上行接口扩展为多个下行接口,使得一个host可以同时与多个device连接。一般来说,一块hub桥接芯片可扩展4个usb接口,而市面上的一拖七hub,其实使用了两块hub桥接芯片,其中一块hub桥接芯片的上行端口连接到另一块hub桥接芯片的下行端口。hub的上行端口面向host,下行端口面向device。在下行端口上,hub提供了设备接入检测和设备移除检测的能力,并给下行端口供电。

weixin_49303682的博客 967

阿里二面,面试官:说说 Java CAS 原理?

声明:本文禁止转载 1. 什么是 CAS? 2. CAS 基本原理 3. CAS 在 Java 语言中的应用 4. CAS 的问题 4.1. 典型 ABA 问题 4.2. 自旋开销问题 4.3. 只能保证单个变量的原子性 5. 有态度的总结 在并发编程中我们都知道i++操作是非线程安全的,这是因为 i++操作不是原子操作。 如何保证原子性呢?常用的方法就是加锁。在Java语言中可以使用 Synchronized和CAS实现加锁效果。 Synchronized是悲观锁,线程开始执行第一步就是.

华科硕士,大厂打工中。编程问题咨询,请私我 1万+

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7895

基于FFT+BP神经网络/决策树的轴承故障诊断

基于FFT+BP神经网络/决策树的轴承故障诊断

天天酷科研的博客 133

面试官超级喜欢问的CAS

# 前言 >自学了一年JAVA阿巴阿巴终于约到了面试,这次面试官让她谈谈对CAS的理解。 **<Center>回去等通知</Center>** > 如果对CAS完全不了解的同学建议先去看看相关的博客了解了基本的原理,再来看面试的时候如何解答 **面试官:** 对CAS有了解吗?可以讲讲吗? **阿巴阿巴:** 了解一些,CAS全称Compare And Swap,也就是比较和交换。 **阿巴阿巴:** CAS的思想比较简单,主要涉及到三个值:当前内存值V、.

m0_61544080的博客 240

安装keil软件时安装不了芯片包怎么回事?芯片包安装路径放在Keill里的packs下面,弹框提示报错:Errors retumned from cpackget...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2207

当面试官问你CAS,他到底在问什么?

良心公众号关注不迷路在搞研发的小伙伴心目中,CAS是一个多义词,其既可以表示CAS(Compare and Swap)无锁算法,又可以表示CAS(Central Authenticati...

W_J_G_的博客 348

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

面试官最爱刁难:说说 CAS 原理,答不好直接淘汰

面试的时候,原地就跟我开大,“CAS原理说说,别光讲表面的!”咱说心里话,这玩意儿,简历上写过、博客里唠过,也见过场面,但真遇到面试官“灵魂追问”,心里还是有点慌。码代码也别太教条,偶尔吐槽两句,你懂的:技术路上,大家都互相踩过CAS的坑。你要是真在面试碰上CAS挖坑,别慌,信仰加源码两把抓,“一口老血”的自嘲精神,未必就不会翻盘。,传入期望值和新值,只有当前值还等于期望值,才会成功“占有奶茶”,否则白忙一局。说白了,CAS是“无锁利器”的招牌,但想把他端上大厂生产环境,还得整点人情世故。

2501_92441786的博客 298

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

白板编程危机:手撕红黑树卡壳,面试官追问CAS底层实现

在终面倒计时5分钟的高压场景下,一名应届生在白板编程环节被要求手撕红黑树,却在关键步骤卡壳。面试官随即追问CAS(Compare-And-Swap)底层实现,制造技术冲突与认知反差。应届生如何在极限时间内突破困境,用极限手段化解危机,成为这场面试的最大悬念。

Ared 1285

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

面试官问我CAS、乐观锁、悲观锁

AQS是Java并发包(JUC)的核心框架,用于构建锁和其他同步器(如ReentrantLock、CountDownLatch等)。它通过一个FIFO队列管理线程的排队与唤醒,并提供了模板方法供子类实现。

2301_79982845的博客 625

醒醒吧 面试官卡你没数吗?是你回答CAS的姿势过于简单了

前言 大家好,我是挨踢大佬,一个总在为粉丝解决面试题的程序员。 最近有几个粉丝说在面试面试中遇到了CAS的问题,连着几次面试都没有让面试官满意,区区CAS底层源码,怎能难倒咱这IT界新秀呢?都支棱起来,跟我一起来搞定CAS底层源码。 正文 什么是CAS CAS的全称是Compare-And-Swap,它是CPU并发原语。 它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的 CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的

weixin_45127309的博客 9603

面试官:讲一下HashMap的原理?谢飞机:... 面试官:你回去等通知吧!

如果一个线程更新了数据库,还没来得及删缓存,另一个线程正好读了旧的缓存,那数据就不一致了。一个线程删了缓存,还没更新数据库,另一个线程来读,发现缓存没有,就去读了旧的数据库数据,又写回缓存…这样下次查的时候,Redis 里没有,就会去查数据库,然后把新的数据又写回 Redis。好,我们聊点实际的。在一个高并发的系统中,用户信息的查询非常频繁,如果每次都从 MySQL 数据库查,压力会很大。当然,底层是“数组 + 链表”,如果链表长度超过一个阈值,好像是 8,就会变成“红黑树”,以提高查询效率。

zuo_hongtao的博客 638

《面试官问我Java中的AQS是啥,我这样答他当场满意》

AbstractQueuedSynchronizer(AQS)是Java并发编程的核心框架,为开发者提供了实现各种同步工具的基础。AQS通过状态管理、CLH队列和模板方法,简化了线程的排队、阻塞和唤醒等复杂操作。其主要特点是使用一个volatile的int变量表示同步状态,并通过CLH队列管理等待线程。AQS支持独占模式(如ReentrantLock)和共享模式(如CountDownLatch、Semaphore),开发者只需实现关键方法如tryAcquire和tryRelease即可定制同步行为。AQS的

龚小帅的博客 1180

面试官:什么是CAS?存在什么问题?

大家好,我是大明哥,一个专注「」系列创作的硬核程序员。

chenssy 的技术博客 1805

线上面试网络闪断时:Java小白手撕红黑树卡壳,面试官抛出CAS底层实现难题

在一场线上面试中,网络意外闪断,导致面试节奏被打乱。当面试官要求应届生在白板上手撕红黑树实现时,小白卡壳,无法继续。就在面试官准备追问算法细节时,他又突然抛出CAS底层实现的难题,试图考察应届生的底层功底。面对突如其来的技术挑战,应届生该如何化解危机?

Ared 593

白板编程卡壳瞬间:应届生手撕红黑树,面试官冷眼追问CAS底层实现

在终面倒计时5分钟的关键时刻,面试官要求应届生在白板上手撕红黑树的插入逻辑,然而应届生在关键步骤卡壳。面试官趁机冷眼追问CAS底层实现的细节,场面一度陷入紧张。应届生如何在极限压力下完成挑战?

Ared 648

用CAS来征服面试官

前言看了好多网上CAS的讲解,但是都是简单介绍,真正亮点都没有讲到,其实想要用CAS征服面试官很简单,请跟我来呗 Tip:同道中人:能看到这,证明你其实是一个有追求的程序猿,点赞,收藏转发...

苦也不苦 217

聊聊CAS - 面试官最喜欢问的并发编程专题

IT技术研习社2020-03-10 17:51:51 什么是CAS 学习Java并发编程,CAS(Compare And Set)机制都是一个不得不掌握的知识点。除了通过synchronized进行并发控制外,还可以通过CAS的方式控制,大家熟悉的ReentrantLock内部实现大量采用CAS进行控制。 CAS即Compare and Swap,即比较并交换。 CAS有三个操作数:内存...

u011277123的博客 466

征服面试官之CAS

文章目录前言一、CAS是什么二、CAS操作三、CAS案例三、CAS缺点之ABA四、CAS缺点之自旋五、LongAdder写在最后,感谢点赞关注收藏转发 前言 看了好多网上CAS的讲解,但是都是简单介绍,真正亮点都没有讲到,其实想要用CAS征服面试官很简单,请跟我来呗 Tip:同道中人:能看到这,证明你其实是一个有追求的程序猿,点赞,收藏转发一波呗,感激不尽 一、CAS是什么 CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三

苦也不苦 369
上一篇: 刷爆LeetCode 字节技术官亲码算法面试进阶神技太香了
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值