synchronized的实现原理与锁升级过程:深入剖析背后的细节!

举报
喵手 发表于 2025/12/08 20:23:25 2025/12/08
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

一、前言

Java 的并发编程中,synchronized 关键字是最基本、最常用的同步机制之一。它的作用看似简单:保证同一时刻只有一个线程能够执行被 synchronized 修饰的方法或代码块。然而,在实现上,它的原理却涉及到大量的底层操作、复杂的锁机制与锁优化技术。要想真正理解它,我们不能仅仅停留在表面,必须深入分析它背后的实现原理及锁升级过程。

在本文中,我们将通过分析 synchronized 的底层实现原理、锁的升级机制、偏向锁、轻量级锁、重量级锁等多种锁的演化过程,揭示它如何高效地实现同步控制以及如何在不同情况下优化性能。

二、synchronized 的原理:从字节码到操作系统

1. synchronized 关键字的基本功能

在 Java 中,synchronized 主要有两种使用方式:

  • 修饰方法:通过修饰实例方法或者静态方法,保证同一时刻只有一个线程能执行该方法。
  • 修饰代码块:通过修饰代码块,限定同步区域,使得在特定区域内,只有一个线程可以访问。

2. synchronized 的底层实现

Java 中的 synchronized 依赖于**对象头(Object Header)监视器锁(Monitor Lock)**来实现同步控制。每个对象都维护着一个监视器锁,每当一个线程执行同步方法或代码块时,必须先获得这个锁。

具体的实现过程如下:

  • 对象头:每个对象都有一个对象头(Object Header),其中包括了对象的锁状态信息。这个对象头包含两部分:

    • Mark Word:用于存储对象的哈希码、GC 状态、锁状态等信息。
    • Class Pointer:指向该对象所属类的元数据(类元信息)。

    在锁相关的操作中,Mark Word 会包含对象的锁状态,如是否处于锁定状态。

  • 监视器锁synchronized 锁的管理是通过监视器锁(Monitor)来完成的。每个对象都有一个与之相关联的 Monitor。线程在进入同步块时,必须获取该对象的 Monitor 锁,执行完同步块后再释放该锁。

3. 锁的状态与竞争

在 Java 的实现中,锁有多个不同的状态,这些状态依赖于锁的持有者和竞争情况:

  • 无锁状态:对象没有被任何线程持有锁。
  • 偏向锁(Biased Locking):一种优化锁的机制,允许锁的拥有者线程在没有其他线程竞争的情况下继续持有锁,减少了获取锁的开销。
  • 轻量级锁(Lightweight Locking):当偏向锁无法再使用时,JVM 会使用轻量级锁,通过 CAS 操作来实现锁的竞争。
  • 重量级锁(Heavyweight Locking):当锁竞争激烈,轻量级锁也无法满足需求时,JVM 会将锁升级为重量级锁,使用操作系统的互斥锁机制进行同步。

三、锁升级过程:从偏向锁到重量级锁

1. 偏向锁(Biased Locking)

偏向锁是一种优化锁竞争的机制,它的目标是减少无竞争时的性能开销。当一个线程获取锁时,它会将该锁标记为偏向锁,之后该线程每次请求锁时,都会发现自己已经拥有锁,因此可以跳过一些锁管理操作,从而降低同步的性能开销。

偏向锁的基本工作流程:

  1. 偏向锁的获取:当一个线程第一次获取某个对象的锁时,JVM 会尝试将这个锁标记为偏向锁,并记录下当前线程的 ID。
  2. 偏向锁的释放:如果该锁被其他线程获取,偏向锁会被撤销,进入轻量级锁的竞争。

偏向锁的优点是能大大减少线程间竞争时的开销,但如果在一个锁被多个线程频繁竞争的情况下,偏向锁会成为一种负担,因此会转向下一阶段的锁类型。

2. 轻量级锁(Lightweight Locking)

当一个线程获取了偏向锁后,如果它在持有锁的过程中发生了线程竞争,偏向锁会撤销并升级为轻量级锁。轻量级锁主要通过**CAS(Compare and Swap)**操作来保证锁的竞争。

轻量级锁的工作流程:

  1. 获取锁时:线程会使用原子操作 CAS 来尝试将锁标记为轻量级锁。CAS 操作会检查该锁对象的 Mark Word 是否为空,如果为空,线程就能成功获得锁。
  2. 竞争时:如果其他线程同时也尝试获取锁,当前线程会发现 CAS 操作失败,此时锁会进入到竞争阶段,可能会升级为重量级锁。

轻量级锁的优势在于,它减少了操作系统层面的开销,不需要进行上下文切换,因此在竞争较轻的场景下能够获得显著的性能提升。

3. 重量级锁(Heavyweight Locking)

当多个线程竞争同一个对象的锁,且轻量级锁也无法满足时,JVM 会将锁升级为重量级锁,采用操作系统提供的互斥锁机制。重量级锁的特点是通过内核同步机制(如 pthread_mutex)来确保线程的独占访问,通常需要进行上下文切换,因此其性能开销较大。

重量级锁的工作流程:

  1. 升级为重量级锁:当锁竞争非常激烈时,轻量级锁会失败并且被升级为重量级锁。此时,线程会进入操作系统内核进行同步。
  2. 阻塞与唤醒:在重量级锁下,线程可能会被阻塞,直到获取到锁之后才会被唤醒。

重量级锁的缺点是性能开销较大,因为它涉及到线程阻塞、唤醒以及上下文切换,但在竞争非常激烈的情况下,重量级锁是必要的。

四、synchronized 锁的优化

1. 自旋锁(Spin Lock)

自旋锁是在轻量级锁的基础上进一步优化的机制。当线程获取不到锁时,它不会立即进行阻塞,而是会在短时间内反复尝试获取锁(自旋),直到成功为止。自旋锁适用于锁竞争较少的场景,因为它可以避免线程在获取锁时产生不必要的上下文切换。

2. 锁消除(Lock Elimination)

JVM 在执行代码时,通过逃逸分析(Escape Analysis)来判断锁是否是多余的。如果在某些情况下,JVM 能够证明锁是无效的,它会消除掉这些不必要的锁,从而提升程序的性能。锁消除通常发生在局部变量的同步代码块中。

3. 锁粗化(Lock Coarsening)

锁粗化是一种优化技术,JVM 会将多个小范围的锁合并成一个大的锁,从而减少获取锁的次数,降低锁管理的开销。

五、synchronized 和其他同步机制的对比

1. synchronizedReentrantLock

  • synchronized:底层依赖 JVM 管理的监视器锁(Monitor Lock),会自动释放锁;适合简单的同步需求,且易于使用,但不提供更细粒度的控制(如超时、可中断等)。
  • ReentrantLock:属于显式锁,使用 lock()unlock() 方法进行锁的获取与释放,提供了更强大的功能,例如可中断、定时锁、死锁检测等。

2. synchronizedvolatile

  • synchronized:保证了可见性、原子性和顺序性,适合处理复杂的同步需求。
  • volatile:仅保证可见性,适合处理一些简单的并发问题,如状态标志的同步。

六、总结

通过深入分析 synchronized 的原理,我们可以发现它不仅仅是一个简单的同步工具,而是一个通过不断升级和优化来解决并发问题的机制。synchronized 从偏向锁、轻量级锁到重量级锁的演变,展示了 JVM 在锁竞争中对性能的极致追求。

  • 偏向锁:减少无竞争时的开销。
  • 轻量级锁:通过 CAS 操作来避免线程阻塞。
  • 重量级锁:当竞争激烈时通过操作系统提供的锁机制来保证同步。

通过了解这些机制,开发者能够更好地理解锁的背后实现,并根据实际需求选择合适的同步策略,写出更高效、更稳定的并发代码。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。