JVM 对 Java 的原生锁做了哪些优化?

举报
赵KK日常技术记录 发表于 2023/06/30 22:50:43 2023/06/30
【摘要】 JVM 对 Java 的原生锁做了哪些优化?Java 的并发机制中,synchronized 关键字是实现线程安全最常用的方式之一。然而,synchronized 关键字在高并发场景下会带来一定的性能开销,这是因为它使用了锁机制来确保线程的互斥性。为了提高 Java 程序在高并发场景下的性能,JVM 对 Java 的原生锁(即 synchronized 关键字)做了一系列的优化。一、偏向锁当...

JVM 对 Java 的原生锁做了哪些优化?
Java 的并发机制中,synchronized 关键字是实现线程安全最常用的方式之一。然而,synchronized 关键字在高并发场景下会带来一定的性能开销,这是因为它使用了锁机制来确保线程的互斥性。为了提高 Java 程序在高并发场景下的性能,JVM 对 Java 的原生锁(即 synchronized 关键字)做了一系列的优化。
一、偏向锁
当一个线程获取锁后,JVM 会将锁的对象头标记为偏向锁。此时,该线程可以无需竞争地获取该锁。这种情况下,锁的获取和释放不需要额外的开销,因为偏向锁会记录线程 ID,使得在该线程持有锁期间,其他线程无法获取该锁。只有在其他线程尝试获取锁时,才会升级为轻量级锁。
二、轻量级锁
当多个线程争夺锁时,JVM 会将锁标记为轻量级锁。此时,JVM 会在锁对象的对象头中记录指向线程栈中锁记录的指针,以及用于保存原始对象的指针。这样,当一个线程尝试获取该锁时,JVM 会将该线程的栈帧中的锁记录与锁对象头中的指针进行比较。如果相同,则表示该线程已经获得了该锁;否则,JVM 会使用 CAS 操作尝试将锁对象头中的指针指向当前线程的锁记录。如果 CAS 操作成功,表示当前线程成功获得了锁。否则,表示有其他线程争夺该锁,此时 JVM 会将锁升级为重量级锁。
三、重量级锁
当多个线程争夺锁时,如果无法获得锁,则会升级为重量级锁。此时,JVM 会使用操作系统的互斥量实现锁。重量级锁的开销非常大,因为需要进行用户态与内核态之间的上下文切换。
JVM 通过偏向锁、轻量级锁和重量级锁的方式,对 Java 的原生锁进行了优化,以提高程序在高并发场景下的性能。需要注意的是,锁的升级过程是由 JVM 内部的锁升级算法来决定的,应用程序员无法直接干预。此外,在实际开发中,应尽量避免使用 synchronized 关键字,以降低锁竞争的概率,提高程序性能。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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