轻量级锁释放过程

当锁记录的 displaced_header=NULL 时,表示 synchronized 嵌套的情形,此时不需要恢复锁对象的对象头,只有在最外层解锁时才会恢复对象头。将displaced_header中的对象头写入锁对象动作是CAS的,如果成功,解锁成功,如果失败,说明某个线程已经将该轻量级锁膨胀成重量级锁了,需要获取对应的重量级锁,完成解锁动作。对比偏向锁的解锁实现可知,轻量级锁支持多个线程占有,但是必须是交替的,不能是同时的。另外很多博客说轻量级锁膨胀成重量级锁前有一个自旋等待的动作,这其实是错误的,轻量级锁的实现只使用了BasicObjectLock一个数据结构,无法支持自旋等待,因为没有地方记录自旋等待的次数,倒是重量级在采用互斥量阻塞当前线程前会先尝试自旋等待一段时间,重量级锁有单独的数据结构可以支持复杂的自旋逻辑。

在 slow_exit 中,如果 CAS 恢复对象头标记字失败,也会调用 inflate 获取 Monitor 对象,调用 Monitor.exit 最终走重量级锁释放。

posted @ 2021-08-08 09:34  TomStudio  阅读(391)  评论(0)    收藏  举报