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

【Java面试笔记:进阶】16.synchronized底层如何实现?什么是锁的升级、降级?

在 Java 中,synchronized 关键字的底层实现依赖于 对象头(Object Header监视器锁(Monitor 机制,并通过 锁的状态升级(Lock Escalation 来优化同步性能。

1. synchronized 的底层实现

synchronized 的同步机制基于 Monitor 对象,它是同步的基本实现单元。
通过 monitorentermonitorexit 指令实现同步逻辑。

1. 对象头与 Mark Word

  • 1.对象头结构
    每个 Java 对象在内存中由三部分组成:

    • Mark Word(标记字段):存储对象自身的运行时数据(如哈希码、锁状态等)。
    • Klass Pointer(类型指针):指向类的元数据信息。
    • 数组长度(仅数组对象有)。
  • 2.Mark Word 内容
    Mark Word 的长度为 32/64 位(取决于 JVM 位数),其内容根据锁状态动态变化:

    锁状态存储内容
    无锁对象哈希码、分代年龄等
    偏向锁持有偏向锁的线程 ID、偏向时间戳
    轻量级锁指向栈中锁记录(Lock Record)的指针
    重量级锁指向监视器(Monitor)的指针

2. 监视器锁(Monitor)

  • 1.Monitor 结构
    每个对象关联一个 Monitor,其核心字段包括:

    • Owner:持有锁的线程。
    • EntryList:等待获取锁的阻塞线程队列。
    • WaitSet:调用 wait() 后进入等待状态的线程队列。
  • 2.锁的获取流程

    1. 线程进入 synchronized 代码块时,尝试通过 CAS 操作修改 Mark Word
    2. 若成功,则获取锁;若失败,则根据锁状态进行 锁膨胀(升级为更高等级的锁)。

2. 锁的升级与降级

  • 锁的三种状态:
    • 偏斜锁(Biased Locking):默认情况下,当没有竞争时使用。通过 CAS 操作在对象头的 Mark Word 部分设置线程 ID,表示对象偏向当前线程。
    • 轻量级锁:当有其他线程尝试获取锁时,偏斜锁会撤销并升级为轻量级锁。轻量级锁依赖 CAS 操作尝试获取锁。
    • 重量级锁:如果轻量级锁竞争激烈,则进一步升级为重量级锁,依赖操作系统内部的互斥锁。
  • 锁升级过程:
    • 无竞争时使用偏斜锁。
    • 有其他线程尝试获取锁时,偏斜锁撤销并

相关文章:

  • 医学图像(DICOM数据)读取及显示(横断面、冠状面、矢状面、3D显示)为什么用ITK+VTK,单独用ITK或者VTK能实一样功能吗?
  • Spring Cloud Alibaba VS Spring Cloud
  • 如何将极狐GitLab 合并请求导出为 CSV?
  • 《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
  • vue3+TS 手动实现表格滚动
  • 取模--特殊情况讨论/数论
  • 机器学习--线性回归模型
  • Unity InputSystem触摸屏问题
  • 使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总
  • 优雅实现网页弹窗提示功能:JavaScript与CSS完美结合
  • PyQt6基础_QTabWidget
  • 新增优惠券
  • 哈希表的实现
  • 大模型AI的“双刃剑“:数据安全与可靠性挑战与破局之道
  • 高精度并行2D圆弧拟合(C++)
  • ORACLE RAC环境使用ASM机制零宕机时间更换存储的实践
  • 安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用
  • 4.4 记忆机制与上下文管理:短期与长期记忆的设计与应用
  • 新时代质量管理体系-端到端流程通俗演义,什么是端到端流程?
  • 3D高斯个人笔记
  • 2025全国知识产权宣传周:用AI生成的图片要小心什么?
  • 政治局会议:创新推出债券市场的“科技板”,加快实施“人工智能+”行动
  • 去年立案侦办侵权假冒案件3.7万起,公安部公布13起案例
  • 牛市早报|特朗普称或将“大幅降低”对华关税,外交部回应
  • 上海市进一步支持汽车置换更新!一图读懂补贴政策实施细则
  • 用一生走丝路,91岁艺术家耿玉琨的书旅奇遇