首页/新闻资讯/正文详情

synchronized 底层深度解析

发布时间:2026/11/5 9:14:05 来源:云帆数科 栏目:资讯中心
synchronized 底层深度解析
2.3.1 类锁和对象锁面试官问这个主要是考察你对锁作用域和内存模型的敏感度。对象锁实例锁用法修饰普通实例方法或者synchronized(this)。本质锁的是当前对象的实例Object。场景不同实例对象之间的锁互不干扰。类锁全局锁用法修饰static静态方法或者synchronized(MyClass.class)。本质锁的是当前类的Class 对象在 JVM 中全局唯一。场景锁住整个类无论 new 了多少个实例都共用这一把锁。面试连环问“如果一个类里有一个synchronized静态方法和一个synchronized实例方法两个线程能同时执行吗”答能。因为它们锁的根本不是同一个对象一个是 Class 对象一个是实例对象。2.3.2 synchronized 的优化JVM 的极限微操早期synchronized是一把“重量级锁”直接调用 OS 的互斥量Mutex涉及用户态和内核态的切换极其耗时。JDK 1.6 引入了“锁膨胀”和“锁消除”等机制。2.3.2.1 锁消除 (Lock Elimination)原理JIT 编译器在编译时通过逃逸分析Escape Analysis发现某段代码中的锁对象不可能被多个线程共享即没有逃逸出当前线程。面试案例在方法内部new了一个StringBuffer并不断append。StringBuffer内部是用synchronized修饰的但因为它只是局部变量JIT 会直接把它的锁干掉直接执行原生的非安全方法极大提升性能。2.3.2.2 锁膨胀/粗化 (Lock Coarsening)原理如果 JVM 发现有一连串连续的、对同一个对象的“加锁-解锁”操作比如在for循环里synchronized频繁加解锁同样耗时。JVM 会将锁的范围扩大到整个循环外部。面试案例javafor (int i 0; i 100; i) { synchronized(lock) { /* 做点小事 */ } } // JVM 优化后 synchronized(lock) { for (int i 0; i 100; i) { /* 做点小事 */ } }2.3.2.3 锁升级 (Lock Escalation) —— 必考核心为了让锁的代价与竞争激烈程度相匹配锁的状态只能升不能降无锁对象刚创建。偏向锁只有一个线程访问。Mark Word 记录该线程 ID。后续该线程再次进入比对 ID 即可零开销注意由于维护成本高JDK 15 后默认废弃。轻量级锁出现多线程交替获取。利用CAS自旋获取锁不进入内核态阻塞线程。适合执行极快的同步块。重量级锁竞争激烈自旋超过一定次数或线程数太多。向操作系统申请互斥量Mutex没抢到锁的线程进入内核态阻塞性能最差但不耗 CPU。2.3.3 synchronized 的实现原理看懂字节码与对象头2.3.3.1 MarkWord对象头里的变色龙这是理解锁升级的物理载体。Java 对象头Object Header中的 Mark Word 在 64 位 JVM 下占 64 bit它为了节省内存复用了这块空间根据锁的状态记录不同的信息无锁记录对象的 HashCode、分代年龄。锁标志位01。偏向锁记录持有锁的线程 ID、Epoch。偏向标志位1锁标志位01。轻量级锁记录指向线程栈中 Lock Record 的指针。锁标志位00。重量级锁记录指向底层ObjectMonitor对象的指针。锁标志位10。(面试加分项说明synchronized修饰代码块时底层字节码使用monitorenter和monitorexit指令修饰方法时底层使用ACC_SYNCHRONIZED标志位。)2.3.3.2 查看锁对象 MarkWord实战工具面试官可能会问“你平时怎么证明锁升级了”答引入JOL (Java Object Layout)库。代码中调用ClassLayout.parseInstance(obj).toPrintable()。通过打印出来的二进制可以直观地看到锁标志位从01变00再变10的全过程。2.3.4 查看 ObjectMonitor重量级锁的真面目当锁升级到重量级锁时Mark Word 里存的指针指向的就是 C 底层的一个复杂结构体ObjectMonitor位于 HotSpot 源码objectMonitor.hpp。它的核心内部结构面试高频_owner指向当前持有锁的线程。_cxq竞争队列Contention Queue单链表。新来的、抢锁失败的线程会被放入这里。_EntryList候选队列存放从_cxq转移过来、准备竞争锁的线程。_WaitSet等待集合存放调用了Object.wait()方法被挂起的线程。底层执行流程线程执行monitorenter尝试把_owner设置为自身。如果_owner为空获取锁成功。如果不为空该线程会被封装成ObjectWaiter节点放入_cxq队列。底层通过调用操作系统的park()方法本质是 Linux 的futex系统调用将该线程挂起进入内核态阻塞。持有锁的线程执行完毕后释放锁并唤醒_cxq或_EntryList里的线程去抢锁。 面试闭环将知识点串联如果面试官问“聊聊synchronized的优缺点”高级回答“早期的synchronized因为直接调用操作系统的互斥量导致频繁的用户态与内核态切换性能很差。但自从 JDK 1.6 引入了锁升级机制后它变得更加智能化只有一个线程时用偏向锁无开销交替执行时用轻量级锁CAS 自旋用户态只有竞争极其激烈时才升级为重量级锁调用 ObjectMonitor进入内核态阻塞。再加上 JIT 编译器的锁消除和锁粗化优化现在的synchronized性能已经非常优异在大多数简单的互斥场景下甚至比ReentrantLock更好因为它是 JVM 原生支持的不需要手动释放锁极大降低了死锁风险。”

相关推荐

MySQL安装流程
MySQL安装流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 9:13:04

MPC-HC 下载安装与最佳配置教程:免费开源、轻量无广告、支持 4K 硬解的 Windows 播放器
MPC-HC 下载安装与最佳配置教程:免费开源、轻量无广告、支持 4K 硬解的 Windows 播放器

MPC-HC 全称为 Media Player Classic Home Cinema,是一款免费开源的 Windows 媒体播放器。它界面简洁、启动速度快、资源占用低,同时内置了基于 FFmpeg/Libav 的解码器,能够播放 MP4、MKV、AVI、MOV、FLV、HEVC、H.264、VP9、AV1 等常见音视频… · 2026/11/5 9:13:04

QSPI-Flash-deepseek 读写测试
QSPI-Flash-deepseek 读写测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 9:13:04

链表节点交换算法与虚拟头节点应用
链表节点交换算法与虚拟头节点应用

1. 链表节点交换的核心逻辑 链表节点交换是数据结构操作中的经典问题,特别是两两交换相邻节点的场景在实际开发中经常遇到。这种操作看似简单,但涉及指针操作的精确控制,稍有不慎就会导致链表断裂或内存泄漏。 1.1 为什么需要虚拟头节点 虚… · 2026/11/5 9:21:10

AI环境监测:从传感器到云端的智能守护
AI环境监测:从传感器到云端的智能守护

1. 项目概述:当AI成为环境守护者 去年夏天,我在参与某沿海城市空气质量监测项目时,亲眼目睹了AI算法如何提前72小时预警到一次赤潮爆发。这套部署在近海浮标上的智能监测系统,通过分析海水温度、PH值和浮游生物密度等18项指标&… · 2026/11/5 9:21:10

STM32读SD卡与FATFS移植:从扇区读写到掉电恢复
STM32读SD卡与FATFS移植:从扇区读写到掉电恢复

简介:这是一套面向STM32嵌入式学习者的SD卡读取与FATFS文件系统实践工程,围绕SPI/SDIO接口访问、扇区读写驱动、FATFS移植配置以及文件打开、读取、写入与关闭操作展开,适合具备C语言与STM32基础、希望掌握嵌入式文件管理的开发者。压缩包共2… · 2026/11/5 9:21:10

STM32 SD卡FATFS文件系统移植与稳定读写实战
STM32 SD卡FATFS文件系统移植与稳定读写实战

简介:这是一份面向嵌入式初学者与工程实践者的STM32 SD卡读写FATFS文件系统学习包,聚焦在KEIL环境下完成SD卡初始化、扇区读写与文件系统挂载,并通过f_open、f_read、f_write等接口实现文件打开、读取、写入和关闭。压缩包共229个文件&#x… · 2026/11/5 9:21:10

关系数据库设计:关系模式与完整性约束实战解析
关系数据库设计:关系模式与完整性约束实战解析

1. 关系数据库的核心基石:关系模式与完整性约束 从事数据库开发十余年,我见过太多因为忽视数据完整性而导致业务逻辑混乱的案例。上周刚处理过一个电商平台的订单数据异常:由于缺少外键约束,用户删除后历史订单全部变成"幽灵… · 2026/11/5 9:21:10

Python自动化测试核心技能与实战指南
Python自动化测试核心技能与实战指南

1. Python自动化测试入门指南刚接触自动化测试时,我花了整整三个月才搞明白哪些是真正需要掌握的核心技能。现在回想起来,如果当时有人能系统地告诉我这些知识点,至少能节省一半的学习时间。这篇文章就是把我这些年积累的Python自动化测试基础… · 2026/11/5 9:20:10

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码