java 锁升级

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          |

4:当线程释放轻量级锁的时候会用cas 吧 hash age放回轻量级锁的mark word中,同时锁标志位变成01

5 当线程B cas 轻量级锁成功,或者失败但是锁的 lock record pointer是自己的时直接进入同步块

5:当线程C cas获取轻量级线程失败,同时 lock record pointer不是自己的时, 轻量级锁膨胀为重量级锁,锁对象的锁标志位变成00。自己本身挂起。

你可能感兴趣的:(java 锁升级)