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

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

影响与性能问题

  1. 增加锁开销:

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

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

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

偏向锁的作用

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

  1. 减少锁的开销:

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

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

偏向锁的工作流程

  1. 锁的获取:

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

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

总结

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

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

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

相关推荐
怒放吧德德8 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆10 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌12 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊13 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang14 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang15 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解15 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing19 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean19 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven9721 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java