偏向锁的释放

偏向锁的释放很简单,只要将对应Lock Record释放就好了,而轻量级锁则需要将Displaced Mark Word替换到对象头的mark word中。如果CAS失败或者是重量级锁则进入到InterpreterRuntime::monitorexit方法中。该方法会在轻量级与重量级锁的文章中讲解。
为什么JVM选择在线程栈中添加Displaced Mark word为null的Lock Record来表示重入计数呢?首先锁重入次数是一定要记录下来的,因为每次解锁都需要对应一次加锁,解锁次数等于加锁次数时,该锁才真正的被释放,也就是在解锁时需要用到说锁重入次数的。一个简单的方案是将锁重入次数记录在对象头的mark word中,但mark word的大小是有限的,已经存放不下该信息了。另一个方案是只创建一个Lock Record并在其中记录重入次数,Hotspot没有这样做的原因我猜是考虑到效率有影响:每次重入获得锁都需要遍历该线程的栈找到对应的Lock Record,然后修改它的值。

解锁的实现在MacroAssembler::biased_locking_exit方法中,其实现非常简单,只是简单的判断下目标对象的对象头是否还是偏向锁,如果是则解锁完成,注意此时并不会将里面的线程指针去掉,这样做是为了该线程下一次加锁的时候可以很快的完成加锁;如果不是,则退出该方法。

https://blog.csdn.net/qq_31865983/article/details/105024397
https://www.jianshu.com/p/4758852cbff4
https://github.com/farmerjohngit/myblog/issues/14

posted @ 2021-08-05 22:00  TomStudio  阅读(432)  评论(0)    收藏  举报