跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Java 锁升级机制详解:偏向锁、轻量级锁与重量级锁

Java 锁升级是 JVM 优化 synchronized 性能的机制。通过无锁、偏向锁、轻量级锁和重量级锁四种状态,根据竞争情况动态调整锁的粒度。无锁时直接访问;偏向锁针对单线程重入,减少开销;轻量级锁利用 CAS 和自旋处理低竞争;重量级锁在竞争激烈时挂起线程,避免 CPU 空转。整个过程由 JVM 自动管理,确保线程安全的同时最大化性能。

栈溢出发布于 2026/3/22更新于 2026/5/916K 浏览
Java 锁升级机制详解:偏向锁、轻量级锁与重量级锁

为什么有锁升级:性能优化的智慧

锁升级的核心目标是在保证线程安全的前提下,最大限度地减少锁带来的性能开销。

场景比喻

用一个简单易懂的'办公室会议室'比喻,给你讲清楚 Java 的锁升级。

首先明确一点:锁升级是 JVM 为了优化 synchronized 关键字性能而设计的内部机制。它的核心思想是:大多数情况下,锁不仅不存在竞争,而且总是由同一个线程多次获得。 因此,没必要一开始就用'大炮'(重量级锁),而是从'小装备'开始,根据需要逐步升级。

整个过程分为 4 个状态,我们想象一个'锁对象'(比如一个会议室)的生命周期:


1. 无锁状态

  • 场景:会议室(锁对象)刚建好,还没人用。任何线程(员工)都可以直接进去使用。
  • 对应:一个新创建的对象,还没被任何线程加锁。

2. 偏向锁(单线程多次访问)

  • 核心思想:这个锁'偏爱'第一个来用它的人。 假设员工 A 第一个使用了会议室。
  • JVM 操作:JVM 会在这个会议室门口贴一张'常驻牌',上面写着'A 专属'。同时,在对象头里记录 A 的线程 ID。
  • 后续:
    • 如果 A 下次又来用会议室,一看牌子是自己的,直接进去,没有任何额外检查,开销极低。
    • 如果员工 B 也想用,会发现牌子是 A 的(发生了竞争)。JVM 会先暂停 A,检查 A 是否还在用会议室。
      • 如果 A 已经用完了(同步代码块已退出),JVM 就把牌子撕掉,然后重新贴成 B 的(偏向锁撤销并重偏向)。
      • 如果 A 还在用,说明有竞争,偏向锁就需要升级。
  • 目的:消除同一线程重入锁的开销。适用于只有一个线程反复进入同步块的场景。

3. 轻量级锁 / 自旋锁(少量线程短时间竞争)

  • 场景:当偏向锁因为竞争(B 也想用)而升级后,就进入这个状态。
  • 比喻:现在会议室没有'常驻牌'了。A 在里面开会,B 来了。B 不会去'领导办公室'(操作系统内核)那里投诉,而是选择在门口等一会儿(自旋),边等边嘀咕:'A 应该快出来了吧?我再等等看……'
  • JVM 操作:
    1. JVM 会在当前线程的栈帧中创建一个'锁记录空间',并拷贝会议室门上的标记。
    2. 然后尝试用CAS 操作(一种乐观的原子操作)把会议室门牌换成指向自己'锁记录'的指针。如果成功,就拿到锁。
    3. 竞争线程(B)通过自旋(循环尝试 CAS)来尝试获取锁。
  • 优点:避免了直接惊动操作系统内核(重量级操作),在竞争不激烈、等待时间极短的情况下效率很高。
  • 缺点:如果 B 在门口等得太久(自旋超过一定次数或自旋线程数增加),就会白占着 CPU 资源,属于'空转',得不偿失。

4. 重量级锁(真正激烈的多线程竞争)

  • 场景:如果 B 在门口自旋等了很久(比如自旋了 10 次),A 还没出来,或者又有 C、D、E…一群员工都在门口自旋等着。
  • JVM 操作:这时候,JVM 就会判定竞争太激烈了。它会将轻量级锁升级为重量级锁。
  • 比喻:
    1. B 不再在门口傻等,而是去'领导办公室'(操作系统内核)正式登记排队。
    2. 操作系统会把 B 放到一个等待队列里,并挂起B 的线程(让 B 去休息,不占用 CPU)。
    3. 当 A 用完会议室出来时,会去'领导办公室'报告。操作系统会从等待队列里叫醒一个(比如 B),让它去用会议室。
  • 特点:
    • 开销大:涉及到操作系统内核的线程调度、状态切换(用户态 -> 内核态)。
    • 不占用 CPU:没拿到锁的线程会被挂起,不消耗 CPU 周期。
    • 适合场景:高并发、长耗时的同步场景。

流程图

文章配图

核心要点

  1. 升级是单向的:从无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。降级理论上会发生但条件苛刻,可以忽略。
  2. 目的:在没有竞争或竞争不激烈的情况下,用最小的开销实现同步。
  3. 自动化:整个过程由 JVM 自动完成,程序员只需正确地使用 synchronized。

简单记忆

  • 偏向锁:'这是我专用。'(适合单线程)
  • 轻量级锁:'我在门口等会儿。'(适合短时间、低竞争)
  • 重量级锁:'我去领导那排队。'(适合高并发、长耗时)

目录

  1. 为什么有锁升级:性能优化的智慧
  2. 场景比喻
  3. 1. 无锁状态
  4. 2. 偏向锁(单线程多次访问)
  5. 3. 轻量级锁 / 自旋锁(少量线程短时间竞争)
  6. 4. 重量级锁(真正激烈的多线程竞争)
  7. 流程图
  8. 核心要点
  9. 简单记忆
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 宇树 G1 机器人建图教程:FAST-LIO 环境配置与 RViz 启动
  • 预训练语言模型与 BERT 实战应用
  • Trae 集成图片素描 MCP 实现多风格图像转换
  • 前后端分离与不分离架构的全面分析
  • Mac Mouse Fix 三大安装方式详解与选择指南
  • C++ 哈希表封装:模拟实现 unordered_map 与 unordered_set
  • LangChain 基本概念与实战入门
  • 2026 年主流网络爬虫工具对比评测与选型指南
  • 数据结构核心:二叉树概念、性质与堆的实现
  • 基于 Nexent 知识库与 MCP 生态打造智能烹饪顾问实战
  • GitSync:Android 平台 Git 仓库同步工具解析
  • 利用大模型生成智能体工作流调用的稳定提示词
  • VS Code 刷新 Python 包报错:Failed to run python -m pip list 修复方案
  • 2026年AI辅助毕业论文写作工具盘点与使用指南
  • PyCharm 集成 GitHub Copilot 安装与配置指南
  • Python 学习指南:核心优势与应用场景解析
  • C++ 内存布局优化与 SIMD 向量化:从对象思维到数据驱动
  • 如何成为一名职业网络安全专家?
  • OpenMAIC:清华开源 AI 课堂生成平台体验
  • GitHub Copilot 学生认证入门指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online