当前位置: 首页 > article >正文

JVM锁升级的过程(偏向锁,轻量级锁,重量级锁)

在Java并发编程中,JVM锁升级是一个动态过程,旨在优化多线程环境下的性能。这个过程通常涵盖从偏向锁到轻量级锁,最后可能升级到重量级锁。以下是JVM锁升级的详细过程:

一、偏向锁(Biased Locking)

  1. 定义与目的

    • 偏向锁是一种针对单线程执行代码块的优化。
    • 它的核心思想是,如果一个同步块是由同一个线程多次进入,那么可以将锁偏向于该线程,避免每次进入和退出同步块时的锁竞争开销。
  2. 加锁机制

    • 当线程第一次进入同步块时,它会在对象头上的锁标记字段中记录线程的ID,表示该锁已经偏向于该线程。
    • 之后该线程进入同步块时,只需要检查对象头的标记字段是否指向自己的线程ID。
  3. 撤销与升级

    • 当另一个线程尝试获取这个偏向锁时,偏向模式会被撤销,锁升级为轻量级锁。
    • JVM会暂停拥有偏向锁的线程,撤销偏向状态,并恢复到未锁定状态,然后重试获取锁。

二、轻量级锁(Lightweight Locking)

  1. 定义与适用场景

    • 轻量级锁适用于锁的竞争较低但有多于一个线程尝试获取同一锁的情况。
  2. 加锁与解锁机制

    • 线程会在自己的栈帧中创建一个锁记录,然后使用CAS(Compare-And-Swap)操作尝试将对象头的锁标记字段更新为指向锁记录的指针。
    • 如果成功,该线程持有锁。
    • 线程再次使用CAS将对象头的指针指回原来的状态,以释放锁。
  3. 升级机制

    • 如果CAS操作失败,表示有其他线程也在竞争这个锁。
    • 若尝试获取锁的线程不断失败,JVM会将轻量级锁升级为重量级锁。

三、重量级锁(Heavyweight Locking)

  1. 定义与适用场景

    • 重量级锁使用操作系统级别的互斥量(mutex)来管理锁的获取和释放。
    • 它适用于锁的竞争非常激烈的情况。
  2. 加锁与解锁机制

    • 如果轻量级锁的竞争激烈,JVM会为对象头关联一个重量级锁(如互斥量)。
    • 之后尝试获取该锁的线程将会阻塞,直到锁被释放。
    • 持有重量级锁的线程完成同步块后,释放互斥量,操作系统会唤醒一个或多个等待这个锁的线程。

四、锁升级过程总结

  1. 初始状态

    • 当没有线程访问同步代码块时,锁处于无锁状态。
  2. 偏向锁阶段

    • 当第一个线程访问同步代码块时,锁升级为偏向锁。
    • 如果后续没有其他线程竞争,偏向锁将一直保持。
  3. 轻量级锁阶段

    • 当有其他线程尝试获取偏向锁时,偏向锁被撤销,并升级为轻量级锁。
    • 轻量级锁通过CAS操作尝试获取锁,如果失败则进行自旋。
  4. 重量级锁阶段

    • 如果轻量级锁的自旋次数超过阈值(默认循环10次,可通过虚拟机参数更改),锁将升级为重量级锁。
    • 重量级锁会导致线程阻塞,并等待操作系统调度。

五、注意事项

  1. 锁升级是不可逆的

    • 一旦锁从低级别状态升级到高级别状态,就无法再降级。
  2. 锁升级带来的开销

    • 锁升级过程可能会带来一定的开销,特别是在竞争激烈的情况下,频繁的锁升级会导致性能下降。
  3. 锁的选择策略

    • 在设计和实现多线程应用时,需要仔细考虑锁的使用策略,以减少不必要的锁升级和性能损耗。

综上所述,JVM锁升级机制是一个动态过程,旨在优化多线程环境下的性能。通过动态调整锁的粒度,JVM可以在不同的情况下选择最合适的同步策略


http://www.kler.cn/news/363286.html

相关文章:

  • linux压缩与解压缩
  • 图像筛选去重、去静止
  • 硬件驱动应用
  • gtest允许开发者实现自定义的事件监听器,以便在测试执行过程中接收和处理特定的事件(如测试用例开始、结束、断言失败等)。如何实现
  • oracle 行转列(PIVOT 多个行数据按照指定的列进行汇总) 列转行(UNPIVOT)
  • Android——FileProvider
  • String的运算符重载
  • C#中跨线程调用的方法一点总结
  • 数据仓库基础概念
  • 新探索研究生英语读写教程pdf答案(基础级)
  • 阿里云服务器如何安装宝塔
  • jupyter DatabaseError: database disk image is malformed 解决办法
  • 分布式检测线路、精准定位故障:输电线路故障定位监测系统
  • 国外电商系统开发-运维系统Docker镜像
  • 构建高效在线教育平台:Spring Boot的力量
  • iPhone图片/照片/视频复制到win10系统的简单方法 - 照片导出
  • Vue 3中的国际化(i18n)实践指南
  • C语言中MySQL库函数
  • MySQL【知识改变命运】09
  • 携程后端JAVA面试汇总
  • SolarWinds Web Help Desk曝出严重漏洞,已遭攻击者利用
  • Golang | Leetcode Golang题解之第496题下一个更大元素I
  • docker清理未使用的 Docker 资源
  • 科技是把双刃剑,巧用技术改变财务预测
  • 什么是SSL证书?
  • 西门子数控软件用在哪些领域及场景