synchronized 底层原理深度详解

synchronized 是 JVM 内置的可重入、非公平互斥锁 ,底层基于对象头 MarkWord + Monitor 监视器 实现,JDK 1.6 后通过锁升级大幅优化性能,保证并发下的原子性、可见性、有序性。


二、底层实现原理(核心必答)

  1. 锁的本质:锁的是对象,不是代码

    • 修饰实例方法:锁当前对象 this
    • 修饰静态方法:锁当前类的 Class 对象
    • 修饰代码块:锁括号里指定的对象
  2. 对象头与 Monitor

    • Java 对象在堆中分为:对象头、实例数据、对齐填充。
    • MarkWord 存储:哈希码、分代年龄、锁状态、线程 ID。
    • 每个对象关联一个 Monitor(ObjectMonitor) ,由 C++ 实现,包含:
      • _owner:持有锁的线程
      • _count:重入计数
      • _EntryList:阻塞等待队列
      • _WaitSet:调用 wait () 的等待队列
  3. 字节码指令

    • 同步代码块:monitorenter 加锁、monitorexit 解锁。
    • JVM 会自动生成两个 monitorexit,保证正常 / 异常都能释放锁。
    • 同步方法:通过方法标识 ACC_SYNCHRONIZED 实现。

三、锁升级流程(JDK 1.6+ 最重要考点)

不可逆流程:无锁 → 偏向锁 → 轻量级锁 → 重量级锁

  1. 偏向锁

    • 适用:单线程反复获取锁,无竞争
    • MarkWord 记录线程 ID,后续直接进入,无同步开销
    • 一旦出现其他线程竞争,立即升级为轻量级锁
  2. 轻量级锁

    • 适用:线程交替执行,竞争时间短
    • 线程在栈帧中创建锁记录,用 CAS 尝试抢占锁
    • 竞争失败则自旋,自旋一定次数仍失败 → 升级重量级锁
  3. 重量级锁

    • 依赖操作系统 Mutex Lock 互斥量
    • 线程进入内核态阻塞,放入 EntryList
    • 开销大,但不占用 CPU

四、三大特性

  1. 可重入 同一线程可多次获取同一把锁,底层靠 _count 计数实现,避免死锁。

  2. 非公平锁线程竞争不按等待顺序,新线程可直接抢占,吞吐量高,但可能产生饥饿。

  3. 保证可见性 加锁时从主存刷新,解锁时写回主存,底层通过内存屏障实现 Happens-Before。


五、高频面试题答案

1. synchronized 保证了什么?

原子性、可见性、有序性。

2. 为什么是可重入锁?

通过 Monitor 中的 _count 计数器实现,同一线程加锁计数 + 1,解锁 - 1,为 0 才真正释放。

3. 锁升级为什么不可逆?

为了简化 JVM 实现,避免状态回退带来的复杂度和并发安全问题。

4. synchronized 和 ReentrantLock 区别?

  • synchronized:JVM 实现,自动加解锁,非公平,功能少
  • ReentrantLock:JDK 实现,手动加解锁,可公平 / 非公平,支持条件等待、超时、中断

六、精简版

synchronized 是 JVM 内置的互斥锁,底层基于对象头 MarkWordMonitor 监视器 ,通过 monitorenter/monitorexit 指令实现。JDK 1.6 后引入锁升级 :无锁→偏向锁→轻量级锁→重量级锁,用来减少高并发开销。它是可重入、非公平锁,能保证原子性、可见性、有序性。

相关推荐
会编程的吕洞宾6 小时前
Spring Boot 虚拟线程实战:从原理到生产环境
java·后端·spring
黑桃小柒77 小时前
Prompt 工程的“断舍离“:如何用更少的词让 AI Agent 更聪明
java·后端·spring
撩妹帝九歌7 小时前
Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!
java·开发语言
一路向北North7 小时前
Spring AI(9) :解决百炼平台兼容性问题
java·人工智能·spring
2601_965798477 小时前
Build a Consulting Site in 2026: Nifty Theme Practical Review
java·linux·数据库
星核0penstarry7 小时前
Solon AI v4.0.4 技术分析:Java Agent 框架的兼容性突破与选型考量 基于 OSCHINA 2026-07-30 报道及公开技术资料整理
java·开发语言·人工智能
五仁烧饼7 小时前
Unity Addressables 资源依赖治理:规则约束、自动修复与全链路防护
java·unity·游戏引擎
spider_xcxc7 小时前
Jenkins 遇见 Argo CD:构建可靠 GitOps 流水线的实战指南
java·开发语言·servlet
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第214题】【10_网络协议篇】第5题:说一下 TCP 协议的三次握手和四次挥手
java·网络协议·tcp·三次握手·四次挥手
我叫唧唧波7 小时前
【Java】Java 基础系统学习笔记
java·笔记·学习