一个线程已经对对象加了轻量级锁,另外一个线程也想对对象加锁,object中的轻量级锁会膨胀成重量级锁,如下所示。
锁膨胀的流程:
- Thread1加轻量级锁失败,进入锁膨胀流程
- 为Object 申请Monitor锁,让object指向重量级锁指针
- 然后自己进入monitor的entrylist进行blocked
锁膨胀之后的解锁流程
- Thread0退出同步代码块,进行解锁时发现object中的markword不再是轻量级锁记录的地址,因此根据monitor去找monitor锁,将其owner置为空,并唤醒entrylist中的Thread1
文章评论