Synchronized
2021-12-28 18:25:17 0 举报
Java 多线程中synchronized的升级机制
作者其他创作
大纲/内容
Mark Word数据结构1.地址:指向Object Monitor地址2.偏向锁:03.锁标志位:10(重量级锁)
Y:t2逻辑
判断t1是否仍在执行同步逻辑
Y
结束
重新尝试获取偏向锁
N
锁膨胀为重量级锁
Lock Record数据结构1.Owner:monitor的MK地址2.HashCode:对象头的HashCode
继续执行同步块
升级为轻量级锁
CAS替换MW中的HashCode,是否成功?
恢复为无锁状态(偏向锁皆为惰性释放)
是否上锁
执行同步块
准备执行synchronized
Lock Record数据结构1.Owner:null2.HashCode:nullMark Word数据结构1.Thread ID: null2.偏向锁:03.锁标志位:01
锁已升级,释放Monitor锁,并唤起其他线程进行锁竞争
线程t2
利用OS mutex调用Object Monitor
自适应自旋等待
CAS更新MW(Mark Word)中ThreadID是否成功
synchronized
Mark Word数据结构1.Thread ID: null2.偏向锁:03.锁标志位:01
达到失败次数
无锁
Lock Record数据结构1.Owner:null2.HashCode:nullMark Word数据结构1.Thread ID: t12.偏向锁:13.锁标志位:01
准备执行撤销偏向锁逻辑
有锁
CAS执行复制操作
共同步骤
等待进入安全点,挂起线程t1
Mark Word中存储ThreadID是否等于当前线程
没达到失败次数
Y:t1逻辑
执行轻量级锁竞争逻辑
执行完成,准备释放锁
Lock Record数据结构1.Owner:monitor的MK地址2.HashCode:对象头的HashCodeMark Word数据结构1.地址:t1的Lock Record地址2.偏向锁:03.锁标志位:00(轻量级锁)
是否可偏向
线程进入Entry Set
线程t1
0 条评论
回复 删除
下一页