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

【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. 死锁必须同时满足四大条件,破坏其一即可破解
http://www.jsqmd.com/news/991964/

相关文章:

  • 3大技术突破重塑网盘下载体验:LinkSwift直链助手深度评测
  • 视频硬字幕提取技术深度解析:如何用本地OCR实现95%去重准确率
  • 【Java实战】基于Poi-tl构建动态Word报告:从模板渲染到图表集成的完整指南
  • 高效Adobe授权破解实战:开源GenP工具的完整配置与优化指南
  • 2026年南宁兴宁区亲测有效除虫灭鼠服务推荐 - 优质品牌推荐商
  • 玉溪市2026最新黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 嵩山路大王
  • 眉山市2026最新黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 嵩山路大王
  • 如何通过自动化技术每天为《崩坏:星穹铁道》节省2小时游戏时间
  • 告别物理摄像头:一个开源Hook方案如何让安卓App用上本地视频文件(微信/QQ实测)
  • 探索zteOnu:重塑你对中兴光猫的掌控方式
  • 别再硬改源码了!用Flask给YOLOv8加个API,轻松把检测结果推给任何设备
  • 别再盲打了!手把手教你给《饥荒》所有生物加上实时血条(含隐藏怪物显示)
  • 突破30+平台限制!kill-doc浏览器脚本:你的终极文档下载助手
  • .NET Windows Desktop Runtime:3步解决Windows应用部署难题
  • 狂雨CMS小说站一键部署包:双端模板+3大平台采集规则+听书/七牛云/百度推送插件
  • 告别Arduino analogWrite!在PlatformIO上玩转ESP32-S3的MCPWM,实现高精度PWM调光/调速
  • 别再只写Demo了!用LabVIEW红绿灯项目,深入理解状态机与定时逻辑设计
  • 终极指南:四步解决老旧Mac兼容性问题,OpenCore Legacy Patcher快速上手
  • 基于视觉感知的智能自动化测试框架:GameAISDK技术深度解析与实战指南
  • 2026 佛山黄金回收哪家好?本地实体龙头持证回收更靠谱 - 奢侈品回收测评
  • 怎样高效解决网盘限速难题:九大平台直链下载工具完整攻略
  • Java电商系统课程设计全套材料:含可运行源码、MySQL数据库脚本与需求文档
  • 告别外挂EEPROM:手把手教你用DSP28335内部Flash实现参数掉电保存(附完整工程)
  • 自适应迭代加权惩罚最小二乘法深度解析:从算法原理到多平台实战指南
  • 基于A星算法的无人机多机协同导航仿真系统多地形 多天气 双模式下的无人机路径规划、避障、轨迹跟踪与性能评估附matlab代码
  • 数学运算的浮点和定点运算
  • 2026年 亚克力双面胶/亚克力双面胶带厂家推荐榜:超强粘性、耐候抗黄变,透明无痕实力之选 - 品牌发掘
  • 本地图片搜索终极指南:5分钟搭建千万级图库搜索引擎
  • 【技术解析】FSD V2:如何用虚拟体素破解3D稀疏目标检测的泛化难题
  • 【效率工具】为什么写代码的都爱 Snipaste?程序员保姆级硬核技巧与工作流实战