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

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

影响与性能问题

  1. 增加锁开销:

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

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

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

偏向锁的作用

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

  1. 减少锁的开销:

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

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

偏向锁的工作流程

  1. 锁的获取:

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

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

总结

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

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

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

相关推荐
唐僧洗头爱飘柔95272 分钟前
(Go基础)变量与常量?字面量与变量的较量!
开发语言·后端·golang·go·go语言初上手
·云扬·5 分钟前
Lambda 表达式详解
java·开发语言·笔记·学习·1024程序员节
linhhanpy12 分钟前
自制操作系统(九、操作系统完整实现)
c语言·开发语言·汇编·c++·操作系统·自制操作系统
ACALJJ3213 分钟前
STL整理
开发语言·c++
豆本-豆豆奶15 分钟前
最全面的Python重点知识汇总,建议收藏!
开发语言·数据库·python·oracle
Bosenya1218 分钟前
【信号处理】绘制IQ信号时域图、星座图、功率谱
开发语言·python·信号处理
monkey_meng19 分钟前
【Rust Crate之Actix Web(一)】
开发语言·后端·rust
AI原吾36 分钟前
探索PyAV:Python中的多媒体处理利器
开发语言·python·ai·pyav
oliveira-time1 小时前
爬虫学习8
开发语言·javascript·爬虫·python·算法
星叔1 小时前
ARXML汽车可扩展标记性语言规范讲解
java·前端·汽车