当前位置: 首页 > 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.gsyq.cn/news/1503713.html

相关文章:

  • 3大技术突破重塑网盘下载体验:LinkSwift直链助手深度评测
  • 【Java实战】基于Poi-tl构建动态Word报告:从模板渲染到图表集成的完整指南
  • 高效Adobe授权破解实战:开源GenP工具的完整配置与优化指南
  • 玉溪市2026最新黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 嵩山路大王
  • 别再硬改源码了!用Flask给YOLOv8加个API,轻松把检测结果推给任何设备
  • 告别Arduino analogWrite!在PlatformIO上玩转ESP32-S3的MCPWM,实现高精度PWM调光/调速
  • 基于视觉感知的智能自动化测试框架:GameAISDK技术深度解析与实战指南
  • 2026 佛山黄金回收哪家好?本地实体龙头持证回收更靠谱 - 奢侈品回收测评
  • 基于A星算法的无人机多机协同导航仿真系统多地形 多天气 双模式下的无人机路径规划、避障、轨迹跟踪与性能评估附matlab代码
  • 2026年 亚克力双面胶/亚克力双面胶带厂家推荐榜:超强粘性、耐候抗黄变,透明无痕实力之选 - 品牌发掘
  • 【技术解析】FSD V2:如何用虚拟体素破解3D稀疏目标检测的泛化难题
  • 【效率工具】为什么写代码的都爱 Snipaste?程序员保姆级硬核技巧与工作流实战
  • COMSOL三维压电悬臂梁频域仿真模板:参数化建模+共振频率扫描+能量采集性能评估
  • 深度解析:DeepSeek-Coder架构设计与多语言代码生成的技术突破
  • 终极视频字幕提取指南:87种语言本地化OCR解决方案
  • Delphi 10.2 Android摄像头实时预览+拍照源码工程(含FMX界面与权限配置)
  • STM32F407HAL库模拟SPI驱动1.8寸TFT(ST7735)屏幕:从零移植到性能优化实战
  • 5分钟免费解锁学术论文:Unpaywall浏览器扩展终极指南
  • GitHub Trending 今日 Top 5 解读:AI Agent、RAG、计算机视觉与 Markdown 知识库正在同时升温
  • 【大模型面经】大模型面试全攻略:月薪30K+AI岗必备
  • 数据库启动报错:42501: 无法打开共享内存段 “/PostgreSQL.******“: 权限不够
  • ECharts饼图数据项太多?试试用渐变色区分系列,提升可读性(附避坑指南)
  • MATLAB实操包:LMS和RLS自适应滤波算法收敛过程动态对比(含多步长/变步长/噪声场景)
  • Springboot 3.5 源码分析-构建与部署全指南:从 Gradle/Maven 插件到 Docker 容器化与云原生部署
  • 【实战指南】3大PaddleOCR识别异常问题与终极解决方案
  • 网盘下载提速终极方案:三分钟掌握八大网盘直链解析神器
  • 四川人力资源外包公司排行:合规与服务能力实测对比 - 奔跑123
  • 5分钟掌握:如何永久免费使用Cursor AI编程助手的完整破解方案
  • 从报表到合同:5个真实业务场景,手把手教你用JS(html2canvas+jspdf)生成高质量PDF
  • CFD多孔介质建模:从理论公式到工程实践的关键步骤解析