锁升级指synchronized在JVM中从无锁→偏向锁→轻量级锁→重量级锁的自动演变过程。无锁时无竞争;偏向锁让首个线程独占,记录线程ID避免重复加锁;当有竞争时升级为轻量级锁,通过CAS和自旋尝试获取;若自旋失败或竞争加剧,则膨胀为重量级锁,依赖操作系统Mutex实现阻塞同步。该机制由JVM自动控制,旨在平衡性能与开销,理解其原理有助于优化同步代码,如减小锁范围、避免长时持锁,使锁尽可能停留在低开销状态。

Java 中多线程锁的升级原理主要指的是 synchronized 锁在 JVM 层面的优化机制,也就是所谓的“锁升级”过程。这个机制是为了在不同竞争情况下平衡性能和安全性,减少线程阻塞带来的开销。
在 HotSpot 虚拟机中,synchronized 使用的锁会根据线程对对象的竞争程度,从无锁状态逐步升级为以下几种状态:
偏向锁的核心思想是:如果一个锁被同一个线程多次获取,就让它“自动获得”,不需要同步操作。
当一个线程第一次获取偏向锁时,JVM 会在对象头中记录该线程的 ID。之后这个线程再进入同步块时,只需检查对象头是否指向自己,是则直接执行,无需加锁操作。
立即学习“Java免费学习笔记(深入)”;
一旦有另一个线程尝试获取该锁,偏向锁就会被撤销,并升级为轻量级锁。
轻量级锁利用 CAS(Compare and Swap)操作将对象头中的 Mark Word 替换为指向线程栈中锁记录的指针。
如果 CAS 成功,说明当前线程获取了锁;如果失败,说明存在竞争,此时线程会进行一定次数的自旋(循环尝试),期望在短时间内持有锁的线程释放。
轻量级锁适用于线程交替执行、竞争不激烈的场景,避免了系统调用带来的上下文切换开销。
当自旋超过一定次数(由 JVM 自适应决定)或等待线程较多时,JVM 会将锁膨胀为重量级锁。
此时,未获取到锁的线程会被挂起(阻塞),进入操作系统层面的等待队列,需要通过 Mutex 来调度唤醒。
重量级锁开销大,但能保证在高并发下的正确性和公平性。
基本上就这些。锁升级的过程是 JVM 自动完成的,开发者无法手动干预,但理解其原理有助于写出更高效的并发代码。比如避免长时间持有锁、减少同步块范围等,都可以帮助锁停留在更轻量的级别。
以上就是java 中多线程锁的升级原理是什么?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号