synchronized锁升级
2020-01-17 09:45:53 0 举报
synchronized锁升级
作者其他创作
大纲/内容
升级成重量级锁
目前锁状态
获得的偏向锁线程id | 01(锁标记位) |1是否偏向锁
获取轻量级锁线程锁记录指针 | 00(锁标记)
执行同步块代码
原持偏向锁线程获取轻量级锁指向原持偏向锁线程锁记录指针 | 00(锁标记)
释放锁
cas把锁记录空间的Mark Word替换回对象头中
挂起当前线程mutex
把对象头设置为无锁状态hash | 01(锁标记位) |1是否偏向锁
是
失败
成功
0(否)
线程范围同步块
1.原持偏向锁线程在栈中创建锁记录空间
检查对象头Mark Word中是否记录当前线程id
原持有偏向锁的线程到达安全点((这个时间点是上没有正在执行的代码))
当前线程
再尝试
偏向锁撤销(依靠竞争才会触发的释放锁机制)
cas操作将对象头的Mark Word中锁记录指针指向当前线程锁记录
01标记
2.拷贝对象头中Mark Word到锁记录空间
10标记-重量级锁
自旋
1(是)
自旋一定次数依然没有成功
暂停原持有偏向锁的线程
尝试cas替换对象头中Mark Word线程id
升级轻量级锁
不是
检查原持有偏向锁的线程状态
从安全点继续执行
是否偏向锁
未活动状态/退出同步代码块
00标记-轻量级锁
未退出同步块
获取重量级锁指向重量级锁monitor的指针 | 10(锁标记)
升级重量级锁
轻量级解锁
唤醒挂起的线程没开始新一轮竞争
0 条评论
下一页