Java synchronized 锁升级机制

Java synchronized 锁升级机制

  • Java 通过引入锁升级机制来优化 synchronized 关键字对应锁的性能,允许锁根据线程竞争程度动态调整状态,从而在不同场景下提供最佳的并发性能,状态从低到高依次为:无锁(未锁定)、偏向锁、轻量级锁和重量级锁
  • 锁状态升级的核心目标是平衡线程安全与性能,通过在不同竞争场景下使用不同级别的锁,减少获取和释放锁的开销
java 复制代码
//锁状态随着竞争激烈程度逐步升级,不可降级
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁

Unlocked 无锁

  • 单线程或无竞争场景(比如原子变量 AtomicInteger 直接通过 compareAndSet 方法尝试获取锁),此时 synchronized 实际退化为无锁(JVM 优化)

Biased Lock 偏向锁

  • 当一个线程第一次获取锁时,会通过 CAS 操作将线程 ID 写入 Object Header 对象头结构中,后续同一线程再次获取锁时仅需比对线程 ID,无需 CAS 操作,避免 CAS 开销
  • 锁会 "偏向" 第一个获取它的线程,后续该线程再次进入时无需竞争,直接使用(零成本获取锁)
  • 为单线程访问优化,减少同一线程反复获取锁的开销
  • 当其他线程尝试竞争时,会撤销偏向锁并升级为轻量级锁

Lightweight Lock 轻量级锁

  • 当偏向锁被其他线程竞争时,升级为轻量级锁,通过 CAS 自旋(循环检查锁状态,直到锁释放)尝试获取锁,实现非阻塞竞争,避免直接进行线程阻塞
  • 轻量级锁的获取过程不需要调用操作系统的互斥量(Mutex),这使得它的性能开销比重量级锁小很多
  • 适合短时竞争(低竞争)、同步块执行速度快的场景
  • 当自旋次数超过阈值(默认 10 次)仍未获取锁或竞争激烈时,升级为重量级锁

Heavyweight Lock 重量级锁

  • 轻量级锁自旋失败或竞争激烈,升级为重量级锁,依赖操作系统互斥量(Mutex)实现,会阻塞其他线程,开销最大
  • 适合长时竞争(高竞争)、同步块执行时间较长(复杂同步逻辑)的场景

总结

  • 偏向锁被其他线程竞争时升级为轻量级锁,轻量级锁自旋失败升级为重量级锁
相关推荐
WJ.Polar9 小时前
Java封装、继承、多态
java·开发语言
ly76899 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠9 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
奇牙coding9 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!9 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻9 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
黄俊懿9 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
Rain的Java大神之路10 小时前
别再死磕 MySQL 了:向量数据库与 RAG 生产落地实录(Java 工程师专场)
java·后端·面试
七夜zippoe10 小时前
Spring AI 是什么?Java 工程师的 AI 开发第一站
java·人工智能·spring·ai·开发
是真的小外套10 小时前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络