news 2026/6/11 11:43:25

【JUC】一文搞定 volatile、CAS、自旋锁、死锁,秋招后端稳上分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【JUC】一文搞定 volatile、CAS、自旋锁、死锁,秋招后端稳上分

大家好,我是程序员二叉。


简介

本篇承接上一篇并发锁内容,覆盖剩余高频炸裂面试题:volatile关键字原理与原子性缺陷、可重入锁机制、公平&非公平锁、悲观&乐观锁、CAS底层原理与三大问题、自旋锁优缺点、死锁四大条件,全是面试高频压轴题,直接背诵即可通关面试。欢迎点赞关注收藏。


一、volatile 关键字两大核心作用

1. 保证内存可见性

多线程缓存不一致时,volatile 强制写刷新主内存、读加载主内存,保证变量实时可见。

2. 禁止指令重排序

通过内存屏障禁止编译器、CPU乱序执行,解决DCL单例重排序漏洞

重点结论

volatile 只保证可见性、有序性,不保证原子性、不保证互斥!


二、为什么 volatile 不能保证原子性?

  1. 复合操作如i++分为三步:读取、计算、写回
  2. volatile 仅保证单次读写可见,无法锁住三步复合操作
  3. 多线程同时读取、同时写回,会产生更新覆盖、数据丢失
  4. 无锁排他机制,无法阻断并发修改

三、可重入锁是什么?为什么需要可重入?

定义

同一线程可多次获取同一把锁,不会自己卡死自己。
代表:synchronized、ReentrantLock

实现原理

内部维护锁计数器 + 线程持有者

  • 重入加锁:count + 1
  • 逐层释放:count - 1
  • count = 0 才算完全释放

必要性

  1. 解决嵌套同步、递归同步自死锁问题
  2. 提升代码健壮性、适配复杂调用链路

四、公平锁 vs 非公平锁

公平锁

  • 机制:线程排队、先来先服务 FIFO
  • 优点:无线程饥饿、执行有序
  • 缺点:上下文切换多、吞吐量低

非公平锁(默认)

  • 机制:线程上来直接CAS抢锁,不排队
  • 优点:切换少、吞吐量极高
  • 缺点:存在线程饥饿风险

五、悲观锁 vs 乐观锁(区别+适用场景)

悲观锁

  • 思想:默认并发一定冲突,先加锁、后操作
  • 实现:synchronized、ReentrantLock、数据库for update
  • 适用:写多读少、竞争激烈、长事务

乐观锁

  • 思想:默认无冲突,无锁、提交校验
  • 实现:CAS、版本号机制
  • 适用:读多写少、竞争微弱、短操作

六、CAS原理|自旋机制|Unsafe类作用

CAS原理(Compare And Swap)

乐观无锁原子操作,三步完成:

  1. 读取内存旧值
  2. 对比预期值
  3. 一致则更新,不一致则重试

自旋机制

CAS失败不阻塞线程,用户态循环重试,避免内核切换开销。

Unsafe类作用

  1. CAS底层native方法全部由Unsafe提供
  2. 直接操作内存偏移地址
  3. 是所有JUC原子类的底层支撑

七、CAS三大致命问题 & 完整解决方案

1. ABA问题

  • 问题:变量 A→B→A,CAS误认为无修改,导致数据错乱
  • 解决:版本号机制 AtomicStampedReference

2. 无限自旋、耗死CPU

  • 问题:高并发下不断重试,空转CPU飙升
  • 解决:自适应自旋、限制重试次数、激烈竞争改用悲观锁

3. 仅支持单个变量原子性

  • 问题:无法保证多变量复合原子操作
  • 解决:对象封装 AtomicReference 或 使用锁同步

八、自旋锁原理 & 优缺点

定义

抢锁失败不阻塞、不挂起,循环自旋重试抢锁。

优点

  • 无用户态内核态切换
  • 短时竞争场景速度极快

缺点

  • 长时间抢不到锁空耗CPU
  • 无法公平排队,容易线程饥饿

九、死锁定义 & 四大必要条件

死锁定义

多个线程互相持有对方所需锁资源,循环等待、永久卡死

四大必要条件(缺一不会死锁)

  1. 互斥条件:资源同一时间只能被一个线程持有
  2. 持有并等待:持有锁的同时,等待其他锁
  3. 不可剥夺:锁只能主动释放,不可强行抢占
  4. 循环等待:线程之间形成环形锁依赖

解决死锁

破坏任意一个条件即可解除死锁


面试速记总结

  1. volatile:可见性 + 禁止重排,不保证原子性
  2. 可重入锁依靠计数器,防止嵌套自死锁
  3. 非公平锁吞吐高,公平锁无线程饥饿
  4. 悲观锁适合写竞争,乐观锁适合读多写少
  5. CAS三大坑:ABA、自旋耗CPU、单变量限制
  6. 自旋锁快但空耗CPU
  7. 死锁必须同时满足四大条件,破坏其一即可破解
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 11:42:39

DSP28335项目实战:如何安全地在程序运行时修改并保存关键参数?

DSP28335实战:运行时关键参数热更新与安全存储方案在工业控制与电机驱动开发中,实时调整系统参数是提升设备性能的关键需求。想象这样一个场景:生产线上的伺服电机正在全速运转,工程师发现当前PID参数导致超调量过大,但…

作者头像 李华
网站建设 2026/6/11 11:42:25

超越微软 Project:现代敏捷项目管理的落地实践

很多技术团队在起步阶段都经历过这样的尴尬:为了管理好项目,引入了一套功能极其强大的重型项目管理软件。结果几个月下来,发现大家抱怨连连,填写工时成了负担,更新状态变成了形式主义的打卡,原本用来提升效…

作者头像 李华
网站建设 2026/6/11 11:40:53

深度解析:DeepSeek-Coder架构设计与多语言代码生成的技术突破

深度解析:DeepSeek-Coder架构设计与多语言代码生成的技术突破 【免费下载链接】DeepSeek-Coder DeepSeek Coder: Let the Code Write Itself 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder 在当今AI代码生成领域,开发者面临着…

作者头像 李华