synchronized如果没有实现偏向锁,直接使用重量级锁,会怎么样?

如果 JVM 没有实现偏向锁(Biased Locking),并且 synchronized 直接使用重量级锁,系统会在所有情况下都采用重量级锁来处理同步。这会导致一些性能上的影响,具体如下:

影响与性能问题

  1. 增加锁开销:

    • 阻塞和唤醒: 重量级锁涉及到线程的阻塞和唤醒,这会引入较大的开销。每次获取和释放锁时,操作系统都需要管理线程的状态,进行上下文切换。这会增加 CPU 和内存的开销。
    • 上下文切换: 线程在被阻塞和唤醒时,操作系统需要进行上下文切换。这种切换会导致额外的 CPU 时间消耗和性能下降。
  2. 资源浪费:

    • 无竞争的情况: 在没有竞争的情况下(即同一线程多次进入同步块),重量级锁的开销是冗余的。因为在这种情况下,锁并不需要实际的线程阻塞和唤醒,只是为了确保线程安全。这会导致资源的浪费。
  3. 性能退化:

    • 频繁的锁操作: 如果所有的同步操作都使用重量级锁,即使在低竞争的情况下,频繁的锁操作会导致系统性能退化。尤其是在高负载的多线程应用中,频繁的线程上下文切换会显著降低应用的吞吐量。

偏向锁的作用

偏向锁(Biased Locking)是一种优化技术,它主要用于减少在没有竞争的情况下的锁开销。其核心思想是:

  1. 减少锁的开销:

    • 无竞争情况下的快速获取: 偏向锁允许一个线程在第一次获取锁时将其标记为偏向于该线程。这样,后续的同步操作中,如果同一个线程再次获取锁,几乎没有任何开销,不需要进行任何阻塞或唤醒操作。
    • 减少锁升级: 只有在出现真正的锁竞争时,偏向锁才会升级为轻量级锁或重量级锁。这可以减少在正常情况下的锁开销。
  2. 优化性能:

    • 提高性能: 在单线程或少线程竞争的情况下,偏向锁可以显著提高性能。它避免了频繁的锁操作,减少了上下文切换和阻塞的开销,从而提升了程序的整体性能。

偏向锁的工作流程

  1. 锁的获取:

    • 第一次获取: 当一个线程第一次获取锁时,JVM 会将锁标记为偏向于该线程。这个标记会记录在对象的头部信息(Mark Word)中。
    • 后续获取: 在没有其他线程竞争的情况下,同一个线程的后续获取不会有任何额外的开销。
  2. 锁的升级:

    • 锁竞争: 当其他线程尝试获取已经偏向的锁时,JVM 会检测到锁的偏向性。如果锁竞争激烈,JVM 会将偏向锁升级为轻量级锁或重量级锁,来处理实际的线程竞争。

总结

如果 JVM 没有实现偏向锁,并且 synchronized 直接使用重量级锁,会导致以下问题:

  • 增加锁开销: 在所有情况下使用重量级锁会增加线程的阻塞和唤醒开销,尤其是在低竞争的情况下。
  • 资源浪费: 在没有竞争的情况下,重量级锁的开销是冗余的,会浪费系统资源。
  • 性能退化: 高负载情况下,频繁的锁操作会导致系统性能退化,降低应用的吞吐量。

偏向锁的引入主要是为了优化在没有竞争的情况下的锁开销,提高系统的整体性能。它通过减少锁操作的开销,减少了上下文切换和资源浪费,从而在多线程环境中提高了应用的效率。

相关推荐
ChinaRainbowSea9 分钟前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
lmryBC4919 分钟前
golang接口-interface
java·前端·golang
ゞ 正在缓冲99%…19 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
孤独得猿20 分钟前
Qt常用控件第一部分
服务器·开发语言·qt
慕斯策划一场流浪25 分钟前
fastGPT—nextjs—mongoose—团队管理之团队列表api接口实现
开发语言·前端·javascript·fastgpt env文件配置·fastgpt团队列表接口实现·fastgpt团队切换api·fastgpt团队切换逻辑
橘猫云计算机设计32 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢36 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
橙橙子23038 分钟前
c++柔性数组、友元、类模版
开发语言·c++·柔性数组
程序媛学姐1 小时前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
2401_840192271 小时前
如何学习一门计算机技术
开发语言·git·python·devops