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 |