偏向锁&轻量级锁获取流程
2018-12-29 10:22:38 157 举报
偏向锁和轻量级锁获取流程
作者其他创作
大纲/内容
无锁
对象存储
created by Marksman @ Hangzhou 2018.12.29
CAS
否
执行同步代码块
支持
CAS替换ThreadID
是否为偏向锁
根据锁状态获得相应的锁
对象头中的Mark Word复制到锁记录中,Displaced Mard Word
失败
是
指向当前线程锁记录中指针|epoch|baiseLock(0)|lock(00)
检查原持有偏向锁的线程的状态
获取目标对象的对象头
轻量级锁获取流程
唤醒原持有偏向锁的线程
当原持有偏向锁的线程栈帧中分配锁记录
线程访问同步代码块
暂停原持有偏向锁的线程
自旋
撤销偏向锁null|epoch|biaseLock(0)|lock(01)
未退出同步代码块
当前线程栈帧中分配锁记录
偏向锁获取流程
升级为轻量级锁
对象头
是否成功
线程挂起park
锁状态
升级为重量级锁
检查对象头中的Mark Word的ThreadID是否为当前线程的ID
获取轻量级锁
1、对象标记 Mark Word2、元数据 metadata
自旋指定次数仍然失败
获得偏向锁(Mark Word)ThreadID|epoch|baiseLock(1)|lock(01)
支持偏向锁
成功
是否为偏向锁升级
1、对象头2、实例数据3、对齐填充 padding
有锁
开始撤销偏向锁
不支持
已经退出同步代码块
结束
收藏
收藏
0 条评论
回复 删除
下一页