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

大厂面试真题-说说synchronized的锁升级过程

在Java中,synchronized关键字是实现线程同步的一种方式,但其性能受到锁开销的影响。为了减少锁带来的性能损失,Java虚拟机(JVM)设计了一套锁升级机制。这一机制使得锁可以从无锁状态逐渐升级至重量级锁,以根据竞争程度动态调整锁策略,达到最佳性能平衡。以下是synchronized锁升级的详细过程:

一、无锁状态

  • 在对象创建之初,它处于无锁状态,没有任何锁标志位被设置。此时,对象可以被任何线程自由访问,因为没有线程试图获取锁。

二、偏向锁状态

  • 当第一个线程尝试获取synchronized锁时,JVM会将对象头标记为偏向锁状态,并在对象头中记录获取锁的线程ID。
  • 如果后续访问仍然是由这个线程发起的,它将无需进行额外的同步检查,即可直接访问对象,因为锁已经偏向于这个线程。这种优化减少了单一线程访问同一对象的开销。
  • 然而,如果其他线程尝试访问这个同步块,偏向锁将被撤销,并进入轻量级锁状态。撤销时会有一定的开销,包括检查偏向锁标识、CAS操作尝试清除偏向锁等。

三、轻量级锁状态

  • 当第二个线程尝试获取同一个对象的锁时,偏向锁会被撤销,对象变为轻量级锁状态。
  • 轻量级锁使用了ThreadLocal(此处指JVM内部为每个线程维护的锁记录,而非java.lang.ThreadLocal类)变量来存储锁记录,而不是直接使用操作系统的互斥锁。
  • 线程会在自己的栈帧中创建一个称为Lock Record的空间,用于存储锁的Mark Word的拷贝。然后通过CAS操作尝试将对象头的Mark Word替换为指向Lock Record的指针。
    • 如果成功,线程获得锁。
    • 如果失败,则说明存在竞争,线程将进入自旋状态,不断尝试CAS操作直到成功或达到自旋上限(JDK1.6前默认10次,之后采用自适应自旋,JVM自动调整)。
  • 自旋锁是线程在获取锁的过程中,不会去阻塞线程,而是通过循环获取锁。这避免了立即进入重量级锁状态,从而减少了线程阻塞和上下文切换的开销。但需要注意的是,如果自旋次数过多仍然没有获取到锁,会消耗较多的CPU资源。

四、重量级锁状态

  • 如果自旋超过一定次数(自旋阈值)仍未获得锁,轻量级锁将升级为重量级锁。
  • 重量级锁涉及操作系统层面的互斥锁(如Linux的mutex),可能导致线程阻塞和上下文切换,从而增加了性能开销。
  • 一旦升级为重量级锁,所有后续试图获取锁的线程都将被阻塞,直到锁被释放。被阻塞的线程会进入等待队列,而持有锁的线程执行完毕后,会唤醒队列中的下一个等待线程。

五、锁升级的特点

  • 锁升级的过程是不可逆的。一旦升级到重量级锁,就不会再降级回轻量级锁或偏向锁。
  • 锁升级是为了在不同的并发压力下优化锁的性能。在低竞争情况下,偏向锁和轻量级锁能够减少不必要的开销;而在高竞争情况下,重量级锁能够确保线程间的正确同步。

综上所述,synchronized的锁升级过程是一个从低开销到高开销、从非阻塞到阻塞的逐渐升级过程。这一机制旨在根据竞争程度动态调整锁策略,以达到最佳性能平衡。


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

相关文章:

  • leetcode 刷题day36动态规划Part05 背包问题(完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶))
  • typescript使用webpack打包编译问题
  • 35.搜索插入位置
  • MATLAB工具库:数据统计分析工具MvCAT、MhAST等
  • 1.4TB! 全台湾2024年三维建筑模型3DTiles数据
  • 知识图谱入门——11:构建动态图谱渲染应用:Vue3与Neo4j的集成与实践
  • STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28
  • Docker_速通_01
  • 停车场停车位检测数据集2166张 违停 带标注 voc yolo 2类
  • LLM大模型的必备入门书:吴恩达大佬 LLM CookBook+AI产品经理必看 《AI重新定义产品经理》
  • 深入理解Web浏览器与服务器的连接过程
  • 期权懂|00后期权新手看过来:如何在期权中交易呢?
  • 性能测试学习2:常见的性能测试策略(基准测试/负载测试/稳定性测试/压力测试/并发测试)
  • Spring入门
  • Kubernetes资源详解
  • 浅谈人工智能之大模型的流式调用:Java 后端实践
  • 台球助教小程序开发搭建/桌球助教到店软件
  • Axios 快速入门
  • 本地访问autodl的jupyter notebook
  • 架构师必须多维度理解架构:视点、视角、视图(附PPT:华为企业架构数据、应用、技术架构设计方法论)