jdk 17 中 synchronized 性能优化已转向 jvm 自动精准适配:偏向锁被彻底移除;轻量级锁配合自适应自旋(动态调优、智能放弃、栈上替换)成主流;jit 深度实现锁消除与锁粗化;并为虚拟线程模型提前优化锁粒度与临界区设计。

关闭并忽略偏向锁
JDK 17 已彻底移除偏向锁代码,无需配置,也无法启用。若项目还保留 -XX:+UseBiasedLocking 参数,JVM 会静默忽略,并在启动日志中警告。强行启用不会生效,反而可能干扰 JIT 判断。生产环境应直接删除所有相关 JVM 参数,避免误导或兼容性隐患。
信任轻量级锁 + 自适应自旋
这是当前默认且主力的锁路径。JVM(HotSpot C2)会根据实时数据动态调整:
- 自旋次数不固定:基于该锁的历史获取成功率、平均持有时间、当前 CPU 负载自动增减
- 智能放弃自旋:若检测到持有线程正在执行 I/O、GC 或长时间计算,立即退出自旋,避免空转
- 栈上替换增强:当逃逸分析确认对象未逃逸(如局部 new 的锁对象),JIT 可将锁记录完全分配在栈帧内,跳过 Mark Word 修改和原子操作
借助 JIT 实现锁消除与锁粗化
这些优化发生在编译期,开发者只需写自然、清晰的代码,JIT 会自动识别:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
锁消除:不仅识别
new StringBuilder().append()这类典型局部对象,还能穿透链式调用(如service.doA().doB()中无共享状态的中间对象),整块同步逻辑被剔除 - 锁粗化:连续多次对同一对象加锁(尤其在循环体内),JIT 会合并为一个外围同步区域,显著减少 monitor 进入/退出开销
注意:无需加注解或特殊写法,但需确保对象确实不逃逸、不被多线程共享——这是触发前提。
适配虚拟线程(Project Loom)模型
JDK 21 GA 后虚拟线程普及,但 JDK 17 已为协同打下基础。即使暂未升级,也应开始调整设计习惯:
- 避免长临界区:虚拟线程下,一个平台线程承载数百个虚拟线程,临界区过长会阻塞整个 carrier 线程
- 优先用结构化并发替代嵌套同步:例如用
StructuredTaskScope(JDK 21+)管理子任务,而非在 synchronized 块内调用多个阻塞方法 - synchronized 语义不变,但锁粒度建议更细:比如用专用锁对象代替
this或getClass(),防止无意扩大竞争范围
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










