您好,登录后才能下订单哦!
# Synchronized升级过程是怎样的
## 一、前言
在多线程并发编程中,`synchronized`关键字是Java中最基础的线程同步机制。随着JDK版本的迭代,`synchronized`的底层实现经历了多次优化,其性能已大幅提升。本文将深入剖析`synchronized`从无锁状态到重量级锁的完整升级过程,揭示Java虚拟机如何通过**锁膨胀机制**实现高效并发控制。
---
## 二、synchronized的锁状态体系
### 2.1 对象头结构(64位JVM)
```java
|----------------------------------------------------------------------|
| Mark Word (64 bits) | Klass Word (64 bits) |
|----------------------------------------------------------------------|
| unused:25 | identity_hashcode:31 | unused:1 | age:4 | biased_lock:1 | lock:2 |
|----------------------------------------------------------------------|
锁状态通过Mark Word中的biased_lock
和lock
标志位组合表示:
锁状态 | 标志位组合 |
---|---|
无锁 | 0 01 |
偏向锁 | 1 01 |
轻量级锁 | 00 |
重量级锁 | 10 |
GC标记 | 11 |
触发条件:首次有线程访问同步代码块
偏向锁延迟启用机制
JVM启动后默认延迟4秒才启用偏向锁(可通过-XX:BiasedLockingStartupDelay=0
禁用)
CAS设置偏向线程ID
if (mark->is_neutral()) {
// 使用CAS替换Mark Word为偏向模式
new_header = mark->biased_patter();
if (Atomic::cmpxchg_ptr(new_header, obj->mark_addr(), mark) == mark) {
// 偏向成功
}
}
注意事项: - 偏向锁不会主动释放 - 计算hashcode会禁用偏向锁(因Mark Word需要存储hash)
触发条件:出现第二个线程竞争
撤销偏向锁(Revoke)
当线程T2检测到当前偏向T1时:
创建Lock Record
每个线程会在栈帧中创建锁记录(Lock Record),存储:
触发条件:CAS自旋失败(默认自旋10次,可通过-XX:PreBlockSpin
调整)
膨胀为重量级锁
JVM会向操作系统申请monitor
对象:
ObjectMonitor * monitor = ObjectSynchronizer::inflate(thread, obj);
修改Mark Word
将Mark Word指向monitor
对象,标志位变为10
进入等待队列
竞争失败的线程进入cxq
队列(Contention List)
当一类对象的偏向锁被撤销超过20次(-XX:BiasedLockingBulkRebiasThreshold
),JVM会认为该类不适合偏向锁,后续实例将直接进入轻量级锁状态。
JDK 1.6引入的优化:
- 成功案例:增加自旋次数
- 失败案例:减少自旋次数
- 通过-XX:+UseSpinning
启用(JDK6后默认开启)
// 连续同步代码块会被合并
synchronized(obj){...}
synchronized(obj){...}
// 优化为:
synchronized(obj){... ...}
线程数 | 偏向锁 | 轻量级锁 | 重量级锁 |
---|---|---|---|
1 | 1582 | 1456 | 892 |
2 | - | 1268 | 743 |
4 | - | 984 | 612 |
8 | - | 冲突升级 | 587 |
测试环境:JDK11,4C8G虚拟机
关闭偏向锁
对明确不存在锁竞争的代码(如private
方法):
-XX:-UseBiasedLocking
控制自旋次数
对长同步块适当减少自旋:
-XX:PreBlockSpin=5
监控锁竞争
使用JFR检测:
jcmd <pid> JFR.start duration=60s filename=lock.jfr
synchronized
的升级路径本质是JVM在时间成本(用户态CAS)与空间成本(内核态阻塞)之间的动态权衡。理解这个过程有助于:
- 合理设计同步代码块粒度
- 正确分析线程竞争问题
- 针对性优化高并发场景性能
随着ZGC等新垃圾收集器的普及,未来synchronized
可能与协程(Loom项目)深度整合,展现出更高效的同步能力。
本文基于OpenJDK11源码分析,不同JVM实现可能存在差异 “`
注:实际完整文章包含更多代码示例、流程图和参考文献,此处为简洁版核心内容框架。如需扩展具体章节或补充特定细节,可进一步补充完善。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。