java锁升级路线 偏向锁->轻量级锁->重量级锁(互斥量)
1: 正常无锁状态
轻量级锁未锁定状态
| 25bit | 4bit | 1bit 是否偏向锁 | 2bit 锁标志位 | 
|---|---|---|---|
| 对象hashcode | 分代年龄 | 0 | 01 | 
偏向锁未锁定状态
| 23bit | 2bit | 4bit | 1bit 是否偏向锁 | 2bit 锁标志位 | 
|---|---|---|---|---|
| 0 | epoch | 分代年龄 | 1 | 01 | 
2: 当A线程要获得锁时,进入偏向模式
- 2.1 如果处于无锁状态,则锁对象会更新为
 
| 23bit | 2bit | 4bit | 1bit 是否偏向锁 | 2bit 锁标志位 | 
|---|---|---|---|---|
| ThreadA id | epoch | 分代年龄 | 1 | 01 | 
- 2.2 若锁对象处于偏向模式,同时threadId等于自己,则直接进入同步模块,不需要进行任何线程调度
 
3:当另一个B线程要获得锁,发现是偏向模式,并且threadA != threadB
- 3.1 在到达安全点时,threadA暂停,偏向锁升级为轻量级锁,这时锁对象头会变成
 
| 30bit | 2bit 锁标志位 | 
|---|---|
| lock record pointer | 00 | 
这时在threadA的栈帧中会有个lock record
|hash|age|01|
|owner          |