尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java synchronized底层原理与锁升级机制详解
1. synchronized关键字的本质与实现原理在Java并发编程中synchronized是最基础也是最常用的线程同步机制。很多人仅仅停留在知道怎么用的层面但真正理解其底层实现原理的开发者并不多。实际上从字节码层面到JVM运行时synchronized的实现涉及一整套精妙的机制设计。1.1 字节码层面的实现差异当我们使用synchronized关键字时根据修饰对象的不同实例方法、静态方法、代码块编译器生成的字节码指令也会有所区别同步方法方法访问标志位会添加ACC_SYNCHRONIZED标记同步代码块使用monitorenter和monitorexit指令对包裹通过javap反编译工具可以看到同步方法在字节码层面并没有显式的锁获取和释放指令而是通过方法的访问标志位实现。JVM在执行方法时会检查这个标志位如果存在则自动获取锁。而同步代码块则会在代码块开始处插入monitorenter指令在结束处插入monitorexit指令包括正常退出和异常退出的情况。这种差异导致两种方式在异常处理上也有不同表现同步方法在抛出异常时会自动释放锁而同步代码块需要开发者确保在异常路径上也正确释放锁。1.2 对象头与Mark Word结构每个Java对象在内存中的布局都包含对象头而对象头中的Mark Word就是实现synchronized锁机制的关键。在64位JVM中Mark Word的结构如下未开启压缩指针|------------------------------------------------------------------| | 锁状态 | 25bit | 31bit | 1bit | 4bit | 1bit | |------------------------------------------------------------------| | 无锁 | unused | hashcode | 0 | 分代年龄 | 01 | | 偏向锁 | threadIdepoch | 时间戳 | 1 | 分代年龄 | 01 | | 轻量级锁 | 指向栈中锁记录指针 | 00 | | 重量级锁 | 指向互斥量(mutex)的指针 | 10 | | GC标记 | 空 | 11 | |------------------------------------------------------------------|这个结构会根据锁状态动态变化。特别需要注意的是在无锁状态下Mark Word中可以存储对象的hashcode而一旦对象被加锁原始的hashcode可能会被替换为锁相关信息。这也是为什么调用hashCode()方法会导致偏向锁撤销的原因。2. 锁升级的全过程解析JDK1.6之后synchronized的锁实现从单纯的重量级锁优化为可升级的锁机制包含偏向锁、轻量级锁和重量级锁三种状态。这种升级是单向的目的是在不同竞争场景下都能获得最佳性能。2.1 偏向锁的获取与撤销偏向锁的引入是基于这样一个统计事实大多数情况下锁不仅不存在多线程竞争而且总是由同一线程多次获得。偏向锁的获取流程如下检查Mark Word中的线程ID是否指向当前线程如果是直接执行同步代码如果不是尝试通过CAS操作竞争偏向锁竞争成功则更新线程ID竞争失败则撤销偏向锁升级为轻量级锁偏向锁的撤销是一个相对耗时的操作需要等待全局安全点safepoint这会暂停所有线程。因此在高并发场景下如果发现大量偏向锁撤销操作可以通过JVM参数-XX:-UseBiasedLocking禁用偏向锁。2.2 轻量级锁的加锁过程当偏向锁被撤销或禁用时线程会尝试获取轻量级锁。其核心是每个线程的栈帧中会创建锁记录Lock Record加锁过程如下在当前线程的栈帧中分配锁记录空间将对象头中的Mark Word复制到锁记录中Displaced Mark Word尝试通过CAS将对象头中的Mark Word替换为指向锁记录的指针如果成功当前线程获得锁如果失败表示其他线程竞争锁开始自旋获取轻量级锁解锁时会使用CAS将Displaced Mark Word替换回对象头。如果成功表示没有竞争发生如果失败表示存在竞争锁会膨胀为重量级锁。2.3 重量级锁的底层实现当轻量级锁自旋超过一定次数默认10次可通过-XX:PreBlockSpin调整或其他线程持有锁时间较长时锁会膨胀为重量级锁。此时Mark Word中的指针指向的是monitor对象也称为管程或监视器锁。重量级锁依赖于操作系统底层的互斥量mutex实现涉及到用户态到内核态的切换因此开销较大。在重量级锁状态下未获得锁的线程会被阻塞进入等待队列直到锁被释放时被唤醒。3. 锁升级过程中的关键细节3.1 批量重偏向与批量撤销在高并发场景下如果发现大量不同线程交替执行同步块频繁的偏向锁撤销会严重影响性能。JVM引入了批量重偏向bulk rebias和批量撤销bulk revoke机制来优化批量重偏向当一个类的偏向锁撤销次数达到阈值默认20次JVM会认为这个类的对象更适合被其他线程偏向接下来会批量重偏向到新的线程批量撤销当偏向锁撤销次数继续增加到更高阈值默认40次JVM会认为这个类的对象不适合使用偏向锁会批量撤销该类的所有实例的偏向锁这两个机制通过-XX:BiasedLockingBulkRebiasThreshold和-XX:BiasedLockingBulkRevokeThreshold参数可以调整。3.2 锁膨胀的条件与过程锁从轻量级膨胀到重量级并不是简单的自旋失败就立即膨胀而是有一套复杂的判断逻辑自旋期间会检查持有锁的线程是否正在执行通过on_stack标志如果持有锁的线程已经离开同步块其他线程可以直接获取轻量级锁只有确认持有锁的线程仍在执行且耗时较长时才会真正膨胀膨胀过程会创建ObjectMonitor对象并设置状态为膨胀中INFLATING最后完成Mark Word的替换并唤醒等待线程3.3 锁的降级机制虽然锁升级是单向的但在某些特殊情况下如GC时重量级锁可以降级为轻量级锁。不过这种降级不是常规路径对开发者基本透明。大部分情况下我们应该认为锁升级是不可逆的。4. 实践中的优化建议4.1 合理选择同步范围对于短小的同步块优先使用同步代码块而非同步方法尽量减少同步块内的代码量遵循快进快出原则避免在同步块内调用耗时操作如IO、网络请求4.2 锁竞争优化策略对于读多写少的场景考虑使用ReadWriteLock代替synchronized对于极高并发的场景可以考虑使用并发容器或CAS操作合理使用ThreadLocal避免共享变量的竞争4.3 JVM参数调优-XX:UseBiasedLocking启用/禁用偏向锁JDK15后默认禁用-XX:BiasedLockingStartupDelay设置偏向锁延迟启用时间默认4秒-XX:PreBlockSpin设置轻量级锁自旋次数默认10次-XX:PrintFlagsFinal查看所有JVM参数的最终值4.4 常见问题排查死锁检测使用jstack获取线程转储查找BLOCKED状态线程和持有的锁锁竞争热点使用JMC或async-profiler分析同步块耗时偏向锁失效检查是否有频繁调用hashCode()或System.identityHashCode()在实际项目中我曾遇到一个案例某服务在流量高峰时出现性能骤降。通过分析发现是某个被频繁调用的同步方法导致了大量线程阻塞。最终我们将这个同步方法拆分为更细粒度的同步块并使用ConcurrentHashMap代替原有的HashMap性能提升了近3倍。这个案例告诉我们理解synchronized的底层原理对于解决实际性能问题至关重要。
RELATED

相关推荐

Gerrit企业级分支规划与代码审查实践

Gerrit企业级分支规划与代码审查实践

1. Gerrit仓库的企业级分支规划必要性 当你在Gerrit上申请一个新仓库时,默认只有master分支孤零零地站在那里,就像拿到毛坯房后面对空荡荡的房间一样无从下手。这种情况在企业级开发中尤为棘手——没有合理的分支规划,代码管理很快就会陷入混…

📅 2026/10/31 16:09:02
程序员资源网站收藏夹管理:分类筛选、安全验证与本地知识库实践

程序员资源网站收藏夹管理:分类筛选、安全验证与本地知识库实践

“资源网站”这四个字,在程序员嘴里出现的频率高得离谱。新人问“有没有好用的资源网站推荐”,老手在群里丢一个链接配一句“你懂得”,然后一群人默默收藏。可真把收藏夹打开,几百个书签里能点开的不超过十个,剩下全是…

📅 2026/10/31 16:09:02
企业能源物联网的数据整合与实时分析实践

企业能源物联网的数据整合与实时分析实践

1. 企业能源物联网的本质解析能源物联网(Energy IoT)正在重塑传统能源管理模式。与消费级物联网不同,企业能源物联网的核心价值不在于设备连接数量,而在于如何将分散的能源数据转化为可执行的业务洞察。在钢铁厂区,我们…

📅 2026/10/31 16:09:02
MORE NEWS

更多资讯

📰

dims 什么意思?从数组维度到工程尺寸,一文讲透多语境用法

1. 从一个搜索词条说起:为什么“dims”值得单独写一篇如果你在搜索引擎里敲下“dims什么意思”这几个字,大概率不是在做学术研究,而是被某个具体场景卡住了。可能是读一份英文技术文档时看到“the dims of the array”,可能是调试…

📰

零代码商城搭建指南:3小时快速上线电商平台

1. 项目概述:零代码商城搭建的崛起最近两年,一个令人兴奋的趋势正在席卷电商领域——无需编写代码也能快速搭建个性化商城。这种低门槛的解决方案让无数创业者、小型商家甚至个人创作者能够轻松实现线上销售梦想。我亲眼见证过一位手工饰品店主在3小时内…

📰

VoiceStudio 一站式语音工作台:AI配音、克隆与修复全解析

项目概述:VoiceStudio 到底解决了什么问题最近在折腾语音项目的时候,脑子里反复冒出“VoiceStudio”这个词。拆开看就是 Voice Studio——声音工作室。但如果你把它理解成一个普通的录音软件,那就太小看它了。我个人的定位是:Voi…

📰

研究生论文交打印稿的前一晚,科迅捷AI(官方网站:www.kexunjie.com)把引用格式的错标了出来

晚上九点半,明天上午就要交装订好的打印稿,你把最后一版通读一遍,翻到参考文献那一页,忽然手停住了:正文里那句张三2022后面标的引用编号,和参考文献列表里的条目对不上。你心里咯噔一下,翻到另…

📰

从《两两相望》拆解网络歌曲传播:关键词簇、mp3试听与音频资源整理方法

1. 从一首歌的标题说起:为什么“两两相望”值得单独拆解 “两两相望”这四个字,第一次看到的时候我以为是某个古风填词作品的名字,点进去才发现是一首被反复收录、反复试听、反复出现在各类音乐聚合页面里的歌曲,演唱者标注为苏汐…

📰

音频合成与语音克隆技术拆解:从TTS到可落地的工作流

最近对“VoiceStudio”这个项目做了几次比较深的使用和拆解,今天抽空把里面的门道整理出来。一个语音工具的标题能火,说明大家确实需要一个能一站式搞定语音合成、音色克隆、音频处理和批量导出的工作台;不只是调一个API那么简单,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬