当前位置:

首页 > 编程开发 > 如何使用Java原生偏向锁与轻量级锁解析对象头锁升级流程

如何使用Java原生偏向锁与轻量级锁解析对象头锁升级流程

Java同步锁的升级过程由JVM基于对象头MarkWord自动管理,不可逆且无API干预。锁状态从无锁经偏向锁(单线程零开销)、轻量级锁(多线程交替自旋)到重量级锁(竞争激烈时系统级阻塞),可通过JOL工具观察触发条件与位模式变化。

本文目录

    先聊聊Ja va里synchronized的锁升级。说实话,这事儿全是JVM在后台悄无声息地打理,开发者没法直接调用什么“偏向锁”或“轻量级锁”的API。但别急——虽然不能手动控制,但你完全可以通过理解对象头(尤其是那个Mark Word的变化),来观察、验证,甚至变相引导锁状态的演进。关键不在于你手动去“调用”,而在于你搞清触发条件、状态标识和运行时行为。

    如何使用Ja va原生偏向锁与轻量级锁解析对象头锁升级流程

    对象头锁升级的核心载体是Mark Word

    每个Ja va对象在堆里都藏着个对象头,里面有个叫Mark Word的家伙——64位JVM上占64比特,32位上占32比特。它动态存储着锁状态、线程ID、GC年龄这些关键信息。锁的四种状态(无锁→偏向锁→轻量级锁→重量级锁)全靠Mark Word里固定比特位的组合来标识。JVM呢,就看着这些位值来决定该怎么处理synchronized请求。说白了,锁升级就是Mark Word里几个比特的“变脸游戏”。

    偏向锁:单线程场景下的零开销优化

    • 触发时机:对象头一回被某个线程进入synchronized块,而且这时候没有其他线程跟它抢。
    • Mark Word变化(64位JVM):
      • 原来无锁态:低2位是01,高位存hashCode或0,偏向位为0。
      • 升级后:偏向位变成1,54位填入当前线程ID,低2位还是01。
    • 行为特点:这个线程后续再进来,不用CAS操作,直接比对线程ID就行,成本几乎为零。但如果其他线程想抢,就得触发偏向撤销(需要STW暂停,不过时间极短)。

    轻量级锁:多线程交替但无激烈竞争时的自旋抢锁

    • 触发时机:偏向锁被撤销了(也就是第二个线程来竞争),但还没到自旋的阈值。
    • Mark Word变化:低2位变成00,其余62位存指向当前线程栈帧中Lock Record的指针。
    • 行为特点:
      • 线程自己在栈上建一个Lock Record,把原来的Mark Word拷贝过来(这叫Displaced Mark Word)。
      • 然后通过CAS操作,把对象头更新成指向这个Lock Record的指针。
      • 如果CAS失败——说明已经被其他线程抢占了——那就自旋重试。默认最多10次(可以用-XX:PretenureSizeThreshold等参数微调)。

    重量级锁:自旋失败或竞争加剧后的系统级阻塞

    • 触发时机:轻量级锁自旋超限、或者多个线程同时争抢、或者锁持有时间太长。
    • Mark Word变化:低2位变成10,其余62位存指向堆中Monitor对象的指针。
    • 行为特点:线程直接挂起,进入操作系统内核态等待队列——用户态到内核态的切换,开销一下子就上来了。

    如何实际观察与验证锁状态?

    • 用JOL(Ja va Object Layout)工具打印对象头:
      System.out.println(ClassLayout.parseInstance(lock).toPrintable());
      配合-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0启动参数,确保偏向锁默认启用。
    • 控制竞争节奏来观察:
      • 单线程反复synchronized(lock),能稳定保持偏向锁。
      • 两线程错峰执行(比如让Thread-1先跑,sleep一会儿再启动Thread-2),容易停在轻量级锁。
      • 多线程高密度争抢(比如for循环启10个线程同步操作),很快就膨胀到重量级锁了。
    • 特别注意:一旦调用obj.hashCode(),对象就永久失去获得偏向锁的资格——因为Mark Word得复用空间存hash,跟线程ID冲突了。

    最后说一句:锁升级是不可逆的,而且整个过程没有代码干预点——它根本就不是个API,而是JVM基于Mark Word位模式和实时竞争情况作出的底层决策。真正有效的“使用”,是写出符合各锁适用场景的代码:避免无谓的哈希计算、控制好临界区粒度、减少锁持有时间。这样,JVM才有机会让锁停留在更轻量的状态,你的程序也就跑得更顺了。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。