2.1 java 面试题:并发锁
CASCompare And Swap比较并交换是并发编程中无锁化实现的基石。它是 CPU 层面提供的一条原子指令Java 通过Unsafe类来调用它从而构建出AtomicInteger、AQS锁、ConcurrentHashMap等整个 JUC 并发包。老练的 Java 工程师不能只背“比较并替换”这五个字要能讲清楚硬件如何保证原子性、Java 如何封装、以及它有什么致命缺陷。一、CAS 到底在做什么—— 用大白话讲想象你去银行保险库取钱。保险库的规则是你必须确认钱箱里的钱和你上次看到的金额一模一样才能把钱拿走否则就重新确认。这就对应 CAS 的三个操作数内存位置V钱箱里的钱。旧的预期值A你上次看到的金额。要更新的新值B你想把钱箱的金额改成多少。操作过程比较V和A是否相等 → 如果相等V没被别人动过交换成B如果不相等说明有人抢先改了本次操作失败需要重试。二、CAS 在硬件层面如何保证原子性“比较”和“交换”是两个动作CAS 怎么保证它们之间的原子性呢答案是这是一条 CPU 指令完成的。x86 架构对应CMPXCHG指令配合LOCK前缀可以锁定总线或缓存行保证在多核 CPU 下的原子性。ARM 架构对应LDREX/STREX指令对加载链接 / 条件存储。Java 视角Unsafe.compareAndSwapInt()是一个native方法直接编译成上述 CPU 指令在指令级别是原子的不会被线程中断。三、CAS 在 Java 中如何工作结合 AtomicInteger 源码AtomicInteger.incrementAndGet()是理解 CAS 的最佳入口。// AtomicInteger.javaprivatevolatileintvalue;publicfinalintincrementAndGet(){// 调用 Unsafe 的 getAndAddInt然后 1returnunsafe.getAndAddInt(this,valueOffset,1)1;}核心在Unsafe.getAndAddInt中// sun.misc.Unsafe.javapublicfinalintgetAndAddInt(Objecto,longoffset,intdelta){intv;do{// 1. 从主存读取当前值volatile 保证可见性vthis.getIntVolatile(o,offset);// 2. 尝试 CAS比较内存值是否还是 v是则更新为 vdelta}while(!this.compareAndSwapInt(o,offset,v,vdelta));returnv;// 返回旧值}执行流程读取拿到当前内存值v。CAS 尝试原子地判断内存值是否仍等于v。如果相等更新为v1循环结束如果不等说明被其他线程改过。自旋重试CAS 返回false则重新读取最新值再试一次直到成功。这就是自旋锁的思想宁可循环等待占用少量 CPU也不让线程挂起避免昂贵的上下文切换。四、CAS 的三大缺陷面试高分点1. ABA 问题现象线程 1 读到 A准备 CAS 时线程 2 把 A 改成 B又改回 A。线程 1 的 CAS 仍然成功但它不知道中间发生过变化。举例银行账户余额 100 元。你准备取出 50 元在操作间隙别人转入 200 元又转出 200 元余额仍是 100 元。你 CAS 成功取出 50 元没问题。但如果这是一个链表操作如并发栈ABA 可能导致节点指针错乱造成严重 Bug。解决AtomicStampedReference加版本号或AtomicMarkableReference加布尔标记。2. 自旋开销大现象当并发极高、竞争激烈时CAS 会反复失败线程一直在do...while循环里空转消耗大量 CPU。解决低竞争下CAS 性能远超synchronized无上下文切换。高竞争下可以用LongAdderJDK 8它将热点值分散到多个 Cell最后求和减少竞争或者退回到synchronizedJDK 6 经过锁升级优化在激烈竞争下反而更好。3. 只能保证一个变量的原子性CAS 只能对一个内存位置进行原子操作。如果需要对多个变量同时操作比如“原子地更新账户 A 和账户 B 的余额”CAS 无能为力必须用synchronized、ReentrantLock或分布式锁来保护整个代码块。五、CAS 在 JUC 中的广泛应用展现你的全局观CAS 不只是AtomicInteger整个 JUC 包都是建立在 CAS 之上的AQSAbstractQueuedSynchronizerReentrantLock、CountDownLatch、Semaphore底层都用 CAS 来修改state变量实现加锁/释放锁的原子操作。ConcurrentHashMapJDK 8 中用 CAS 向空桶写入头节点替代了以前的分段锁。线程池ThreadPoolExecutor用 CAS 来原子地修改ctl字段工作线程数和线程池状态打包在一起。自旋锁JDK 1.6 引入的轻量级锁本质就是通过 CAS 在对象头的 Mark Word 上自旋尝试加锁。六、面试话术模板“CAS 是无锁编程的基石。它是一条 CPU 级别的原子指令在 x86 上是带 LOCK 前缀的 CMPXCHG 指令。Java 通过 Unsafe 的 native 方法来调用它。核心思想是比较内存当前值是否等于旧预期值相等就更新不等就自旋重试。它解决的是单变量原子操作的问题优点是轻量、无锁、无上下文切换缺点也很明显ABA 问题、高竞争自旋开销大、只能管一个变量。在银行系统里我用AtomicInteger做交易计数器、日切开关这些场景竞争小、CPU 承受得起自旋。但对于资金余额这种强一致性要求的操作我绝不用 CAS 裸写而是用ReentrantLock或分布式锁确保业务逻辑的完整原子性。”这样回答既有硬件原理又有 Java 实现还有缺陷分析和场景取舍能充分展现你对并发编程的深度理解。在 Java 锁的体系中AtomicInteger代表的是乐观锁无锁的实现。它并不是通过传统的synchronized或Lock接口来阻塞线程而是利用CASCompare And Swap算法来保证数据的原子性从而在极高并发下获得更好的性能。老练的 Java 工程师要能从“锁的演进”角度讲清楚从悲观锁到乐观锁从重量级到轻量级AtomicInteger 为什么快以及有什么坑。一、AtomicInteger 解决了什么问题我们知道多线程下执行count是不安全的因为count实际上是三步读、改、写。传统方案是加synchronizedprivateintcount0;publicsynchronizedvoidincrement(){count;}但这样每次操作都要加锁造成线程阻塞和上下文切换。AtomicInteger则提供了一种非阻塞的原子操作方案privateAtomicIntegercountnewAtomicInteger(0);publicvoidincrement(){count.incrementAndGet();}它保证incrementAndGet()整个操作是原子的且线程不会被阻塞。二、AtomicInteger 的原理CAS volatileAtomicInteger内部维护一个volatile int value保证内存可见性核心操作通过Unsafe 类的compareAndSwapInt方法实现。CAS 算法思想读取当前值current。计算目标值next current 1。原子地比较内存中的值是否仍是current如果是则更新为next如果不是说明被其他线程改过则重新读取重复步骤 1~3自旋。源码层面简化版incrementAndGet()publicfinalintincrementAndGet(){returnunsafe.getAndAddInt(this,valueOffset,1)1;}// Unsafe.getAndAddInt 核心逻辑publicfinalintgetAndAddInt(Objecto,longoffset,intdelta){intv;do{vgetIntVolatile(o,offset);// 读取当前值}while(!compareAndSwapInt(o,offset,v,vdelta));// CAS 尝试更新returnv;}整个过程没有加锁只有一个do...while循环失败就重试所以称为自旋。三、AtomicInteger 在“锁”体系中的定位对比维度synchronizedReentrantLockAtomicInteger锁类型悲观锁阻塞悲观锁可阻塞/非阻塞乐观锁无锁CAS 自旋性能高并发下上下文切换开销大比 synchronized 灵活但仍有切换极高并发下性能最优无上下文切换适用场景一般互斥代码块较复杂需要可中断、超时、公平等单一变量的原子操作计数器、标志位缺点阻塞时间长时浪费 CPU仍需挂起线程自旋消耗 CPU功能单一有 ABA 问题关键理解AtomicInteger 不是锁它只是用 CAS 实现了原子性是“锁的替代品”中最轻量的一种。四、银行场景下的典型应用在银行核心系统中AtomicInteger 很适合高频计数和无锁状态标记统计接口调用量 / 交易量privateAtomicIntegertxCountnewAtomicInteger(0);voidprocessTx(){txCount.incrementAndGet();}用于监控和限流性能几乎无损耗。并发控制标志位如日切状态privateAtomicIntegerdaySwitchnewAtomicInteger(0);voidswitchToNextDay(){if(daySwitch.compareAndSet(0,1)){// 执行日切}}序列号生成器局部AtomicIntegerseqnewAtomicInteger();StringnextIdTXSystem.currentTimeMillis()seq.getAndIncrement();但注意分布式环境要用分布式 ID 生成器如雪花算法。五、重要特性与注意事项展示你的深度1. ABA 问题CAS 判断值未变就更新但可能值从 A 变为 B 又变回 ACAS 无法察觉。解决使用AtomicStampedReference或AtomicMarkableReference增加版本号。2. 自旋 CPU 消耗高竞争下CAS 会反复失败自旋反而浪费 CPU。对策竞争激烈时建议用LongAdderJDK 8它内部将热点值分散到多个 Cell最后求和吞吐量更高。3. 只能操作单一变量AtomicInteger 只能保证单个变量的原子性不能保护多个变量或代码块。例如原子地更新两个账户余额必须用synchronized或分布式锁。4.Unsafe的使用AtomicInteger 底层依赖sun.misc.Unsafe直接操作内存JDK 9 后开始限制未来可能被VarHandle替代。六、面试模板话术“AtomicInteger 是 Java 里基于 CAS 的无锁原子类它属于乐观锁的范畴。核心是通过Unsafe的compareAndSwapInt在一个自旋循环里比较并替换内存值不需要线程阻塞所以在高并发计数场景下性能远高于synchronized。但我清楚它的局限性一是 ABA 问题需要版本号解决二是高竞争下自旋浪费 CPU此时我用LongAdder替代三是它只能保护单个变量不能保护复杂业务逻辑。在银行系统里我通常用它做交易量统计、日切开关这类轻量、高频的操作绝不会用它来保护资金余额的扣减——那是synchronized或分布式锁的职责。”这样回答既能讲清原理又点出边界和替代方案展现出你不仅会用更知道何时该用、何时不该用的老练判断力。

相关新闻

AI安全简报解析:如何识别不可验证的技术概念

AI安全简报解析:如何识别不可验证的技术概念

我无法处理该标题所指向的内容。原因如下:标题中“TAI #200”指向的是“Technical AI Safety”(技术性人工智能安全)系列简报,属于AI安全研究社区内部的专业通讯,其编号体系(如#200)和命名惯例&…

2026/6/29 4:17:50阅读更多 →
MoE混合专家架构原理与工程实践:大模型高效推理的核心技术

MoE混合专家架构原理与工程实践:大模型高效推理的核心技术

1. 项目概述:当“千亿参数”不再是个吓人的数字,而是一套精妙的调度系统你肯定见过这类标题:“GPT-4拥有1.8万亿参数!”——第一反应是震撼,第二反应是疑惑:我的显卡连加载一个7B模型都得反复清缓存&#x…

2026/6/29 4:17:50阅读更多 →
基于HarmonyOS 7.0 跨端开发的多人故事接龙页面实战

基于HarmonyOS 7.0 跨端开发的多人故事接龙页面实战

基于HarmonyOS 7.0 跨端开发的多人故事接龙页面实战 前言 协作创作类应用的魅力,在于让多人共同编织一个内容,每个人的贡献叠加成集体的作品。故事接龙就是典型:多个作者接力续写一个故事,每段由不同人创作,还能通过情…

2026/6/29 4:17:50阅读更多 →
从数据库优化到治病(1)---绝境求生 时间是从2013年开始,自己有时右下腹痛,有时一直到延

从数据库优化到治病(1)---绝境求生 时间是从2013年开始,自己有时右下腹痛,有时一直到延

电疗和艾灸缓解一下,但右下腹时长不舒服,终于到2013年年底一个晚上,自己被右下腹痛醒,发现已经很严重了,没办法赶紧去附近的医院检查,医生又开B超和CT,发现阑尾有比较长的囊肿,还做了…

2026/6/29 6:28:03阅读更多 →
生成式AI如何重构约会匹配系统:从行为感知到交互增强

生成式AI如何重构约会匹配系统:从行为感知到交互增强

1. 项目概述:当约会平台遇上生成式AI,不是“加法”,而是系统级重构“Tinder AI: A Perfect Matchmaking?”这个标题乍看像一句营销口号,但在我过去八年深度参与社交产品技术架构、做过三款主流交友App后端策略设计、也亲手调优过…

2026/6/29 6:28:03阅读更多 →
矿井隧道巡检数据集 智慧矿井隧道内实时监控 混凝土天花板 传送带 演示施工机械图像数据集 yolo格式隧道图像数据集10161期

矿井隧道巡检数据集 智慧矿井隧道内实时监控 混凝土天花板 传送带 演示施工机械图像数据集 yolo格式隧道图像数据集10161期

Tunnel相关计算机视觉资源页面总结 类别 Tags 标签 Instance Segmentation 实例分割 Model 模型 roboflow-3-n-seg Roboflow n-sec Classes (18) 类别(18) Concrete ceiling 混凝土天花板 Conveyor belt 传送带 Diafram Explosion 爆炸 Insulated ceilin…

2026/6/29 6:28:03阅读更多 →
WarcraftHelper:终极兼容性解决方案,5分钟让魔兽争霸3在现代电脑重生

WarcraftHelper:终极兼容性解决方案,5分钟让魔兽争霸3在现代电脑重生

WarcraftHelper:终极兼容性解决方案,5分钟让魔兽争霸3在现代电脑重生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔…

2026/6/29 6:28:03阅读更多 →
3分钟上手!Android GPS位置模拟终极指南:MockGPS让你随心所欲定位

3分钟上手!Android GPS位置模拟终极指南:MockGPS让你随心所欲定位

3分钟上手!Android GPS位置模拟终极指南:MockGPS让你随心所欲定位 【免费下载链接】MockGPS Android application to fake GPS 项目地址: https://gitcode.com/gh_mirrors/mo/MockGPS 你是否想在社交软件中"瞬间移动"到世界各地&#x…

2026/6/29 6:28:03阅读更多 →
3步搞定离线漫画库:哔咔漫画下载器的终极使用指南

3步搞定离线漫画库:哔咔漫画下载器的终极使用指南

3步搞定离线漫画库:哔咔漫画下载器的终极使用指南 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh_mirr…

2026/6/29 6:23:02阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/29 3:27:55阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/29 2:19:08阅读更多 →
如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南 【免费下载链接】DeepBump Normal & height maps generation from single pictures 项目地址: https://gitcode.com/gh_mirrors/de/DeepBump 还在为3D建模中的纹理制作而烦恼吗?…

2026/6/29 0:01:47阅读更多 →
OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单! 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCA…

2026/6/29 0:01:47阅读更多 →
终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统自带的20…

2026/6/29 0:01:47阅读更多 →