synchronized
2022-03-04 23:15:51 1 举报
过程
作者其他创作
大纲/内容
偏向锁加锁成功
当前线程
不在:没记录
在当前线程栈插入一条锁记录;指向锁对象,并将displaced字段值为无锁状态markword
遍历持锁线程锁记录,看是否还持有锁(即是否还在同步代码块内)
轻/重锁
检查偏向锁线程是否存活:
消亡
在:有记录
monitor enter
加锁
锁对象改为无锁状态
01:无锁/偏向锁
重入锁成功
是:重入锁
将偏向锁对象的线程ID(54bit)指向当前线程。
CAS成功
锁升级:偏向锁->轻量级锁
偏向锁 -> 轻量级锁当前线程发现偏向锁ID线程不是当前线程,进行锁升级:
锁记录:指向锁对象的指针、displaced字段存放所对象的markword
这里指的任何情况下没有其它线程用此锁情况:即此锁对象没有被其他线程锁过
1、当前线程提交一个撤销偏向锁任务到VM线程任务队列;2、VM线程后台处理任务队列,处理到此任务时,检查任务是否需要在safepoint下处理;3、在safepoint时处理此任务:
存活
否
CAS失败
检查前54bit的线程ID是否为当前线程
检查锁对象状态
在当前线程栈插入一条锁记录;指向锁对象,将displaced字段置空
收藏
0 条评论
下一页