news 2026/4/21 2:13:48

Java锁机制八股文

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java锁机制八股文

一、简短结论

  1. CAS是基础:所有Java锁机制的底层都依赖CAS实现原子操作
  2. AQS是框架:ReentrantLock等JUC锁基于AQS,AQS使用CAS+CLH队列
  3. synchronized是混合锁:经历了偏向锁→轻量级锁→重量级锁的升级过程,内部大量使用CAS
  4. 锁选择原则:简单场景用synchronized,需要高级功能用ReentrantLock

二、详细内容

1. CAS(Compare And Swap)

定义:无锁算法的核心,原子性地比较并更新值

实现原理

// 伪代码booleanCAS(Vexpect,Vupdate){if(currentValue==expect){currentValue=update;returntrue;}returnfalse;}

Java实现

  • sun.misc.Unsafe类的compareAndSwapInt/Long/Object
  • JUC包中的Atomic类:AtomicIntegerAtomicReference

特点

  • 乐观锁思想
  • 通过自旋(循环尝试)实现
  • 解决ABA问题:使用AtomicStampedReference(带版本号)

2. AQS(AbstractQueuedSynchronizer)

作用:JUC并发包的基石框架

核心组成

  • state:同步状态变量(volatile)
  • CLH队列:双向链表存储等待线程
  • Node节点:包含线程、等待状态、前后指针

ReentrantLock与AQS关系

  • 公平锁/非公平锁都是AQS子类
  • state=0表示锁空闲,state>0表示被持有
  • 可重入:state记录重入次数

AQS的CAS使用

// 状态更新protectedfinalbooleancompareAndSetState(intexpect,intupdate){returnunsafe.compareAndSwapInt(this,stateOffset,expect,update);}// 队列操作(入队、设置头尾节点)都用CAS保证线程安全

3. synchronized锁升级过程

Java对象头Mark Word结构(64位):

| 锁状态 | 54位 | 2位 | 1位(偏向) | 2位(锁标志) | |----------|----------------------|------|-----------|-------------| | 无锁 | hashCode/分代年龄等 | | 0 | 01 | | 偏向锁 | ThreadID(54位) | | 1 | 01 | | 轻量级锁 | 指向栈中锁记录的指针 | | | 00 | | 重量级锁 | 指向Monitor的指针 | | | 10 | | GC标记 | 空 | | | 11 |

锁升级流程

  1. 偏向锁(单线程访问)

    • 首次进入:CAS设置ThreadID到Mark Word
    • 重入:检查ThreadID匹配直接进入
  2. 轻量级锁(轻度竞争)

    • 有竞争时撤销偏向锁
    • 创建锁记录(Lock Record)复制Mark Word
    • CAS将对象头指向锁记录
    • 失败则自旋尝试
  3. 重量级锁(重度竞争)

    • 自旋超过阈值(默认10次)
    • 膨胀为重量级锁,向OS申请互斥量
    • 线程进入等待队列,涉及内核态切换

synchronized中的CAS应用

  • 偏向锁获取/撤销
  • 轻量级锁的锁记录设置
  • 锁升级的状态转换

4. synchronized vs ReentrantLock

synchronized

  • JVM内置,自动管理锁获取/释放
  • 非公平锁(但内部有优化)
  • 只有一个条件队列(wait/notify)
  • 优化后性能接近ReentrantLock

ReentrantLock

  • JDK实现,基于AQS
  • 手动lock/unlock(需finally释放)
  • 可中断、可超时、可公平
  • 支持多个Condition
  • 提供tryLock非阻塞获取

使用选择

  • 简单同步:synchronized(简洁不易出错)
  • 复杂需求:ReentrantLock(灵活控制)

5. 关键问题答案

Q1:AQS内部使用CAS还是什么?

  • 主要使用CAS:更新state、入队出队、设置头尾节点都依赖CAS
  • 配合volatile:state用volatile保证可见性
  • park/unpark:线程阻塞/唤醒机制

Q2:synchronized的实现原理?

  • 混合锁实现:偏向锁+CAS+轻量级锁+重量级锁
  • 锁升级策略:根据竞争强度动态升级
  • CAS关键作用:锁状态转换、线程ID设置、锁记录操作

6. 锁优化建议

  1. 减少锁粒度:锁尽量小的代码块
  2. 减少锁持有时间:尽快释放锁
  3. 读写分离:读多写少用读写锁
  4. 无锁化:能用CAS就不用锁
  5. 避免锁嵌套:预防死锁

7. 现代优化趋势

  1. 偏向锁废弃(Java 15+):维护成本高,实际收益有限
  2. 自适应自旋:根据历史成功率动态调整自旋次数
  3. 锁消除:JIT编译器移除不可能竞争的锁
  4. 锁粗化:合并连续的小锁为一个大锁

总结:Java锁机制从底层CAS到高层AQS再到synchronized,形成完整的并发控制体系。理解这些原理有助于写出高效、正确的并发代码,也能更好地排查并发问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 17:13:21

微信视频号下载器,蝴蝶号视频下载

自媒体必备神器-微信视频号下载器 - 教你如何下载视频号视频 体积小、使用简单、支持 macOS 和 Windows 系统。 一、下载器简介 对于自媒体人来说,获取和保存微信视频号上的优质视频内容,是日常创作和学习的重要一环。为了帮助大家轻松下载微信视频号…

作者头像 李华
网站建设 2026/4/18 8:44:50

强烈安利9个AI论文平台,本科生毕业论文轻松搞定!

强烈安利9个AI论文平台,本科生毕业论文轻松搞定! AI 工具让论文写作变得轻松高效 在当今这个信息爆炸的时代,本科生的毕业论文写作早已不再是单纯的学术挑战,而是一场与时间、效率和质量的较量。尤其是面对复杂的选题、繁重的文献…

作者头像 李华
网站建设 2026/4/17 12:46:01

51单片机——GPIO、按键、中断、定时器与PWM

目录 一、GPIO 1.1 核心概念 1.2 工作模式分类 1.2.1 输出模式:控制外设 1.2.2 输入模式:检测外设信号 二、独立按键 2.1 硬件连接原理 2.2 核心工作逻辑 2.3 消抖处理 三、中断系统 3.1 中断核心概念 3.2 中断源分类与关键参数 3.3 中断处…

作者头像 李华
网站建设 2026/4/18 21:32:50

论文初稿难产?10款AI工具助你高效降重与生成,大幅提升写作效率

�� AI工具性能速览表 工具名称 核心功能 处理时间 AI生成率控制 适配检测平台 askpaper 降AIGC率降重同步 20分钟 个位数 知网/格子达/维普 秒篇 AI痕迹深度弱化 20分钟 个位数 知网/格子达/维普 aicheck 全学科初稿生成 20-30分钟 低…

作者头像 李华
网站建设 2026/4/17 21:42:38

【开题答辩全过程】以 基于springbootvue图书馆选座系统设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

作者头像 李华