Synchronized锁升级 —— 轻量级锁升级为重量级锁
轻量级锁 到 重量级锁:释放锁(1~4)并唤醒等待线程
- 线程1初始化Monitor对象
- 将状态设置为碰撞中(inflating)
- 将Monitor中的header属性设置为对象的MarkWord,即将当前线程的Lock Record中存放到MarkWord(hashcode + epoch + 偏向锁标志位)设置到ObjectMonitor对象的header属性中
- 设置对象头为重量级锁状态(标记位改为10),然后将前30位指向第一步中该线程初始化的Monitor对象 => 真正的锁升级是由线程1操作的
- 唤醒线程2
- 线程2开始争抢重量级锁
线程2整个过程只干了一件事:设置了一个临时的重量级锁指针。
最终的重量级锁指针需要线程1初始化并设置。并且线程2被唤醒之后不一定会抢到这个重量级锁,因为synchronized是非公平锁。但是线程2是轻量级锁升级为重量级锁的奠基线程。
资料:https://www.bilibili.com/video/BV1AC4y177hN/ 强推 河北王校长