锁优化
2021-06-08 17:31:02 3 举报
Java的锁优化的流程图
作者其他创作
大纲/内容
第一个线程t1尝试获取此锁
否
释放锁
是
t2开始自旋尝试获取锁
变为未锁定状态
轻量级锁
t1又来获取此锁
无锁
自旋过程中线程t3尝试获取此锁
t1持有此锁
线程x持有此锁
此锁膨胀为重量级锁
偏向锁
直接进入同步代码块
可偏向
另一个线程t2又来获取此锁
t2持有此轻量级锁
使用CAS操作尝试把对象的Mark Word更新为指向Lock Record的指针,如果更新成功则此对象处于轻量级锁定状态。若更新失败检查对象的Mark Word是否指向当前线程的栈帧,如果是表示当前线程拥有这个锁,可直接进入同步块执行,如果失败则表示这个锁对象被其他线程抢占了。如果出现两个以上的线程争用,则轻量级锁膨胀为重量级锁。
当有线程尝试获取此锁
升级为轻量级锁
重量级锁
相同的线程x尝试获取此锁
是否处于锁定状态
t2在自旋阈值到达之前是否获取到锁
偏向模式结束
锁被线程x持有
JDK6之后对象刚创建出来是可偏向的,当一个线程访问同步代码块并获取锁时,会在Mark Word里存储锁偏向的线程ID,当另一个线程又来尝试获取此锁的时候,偏向模式宣告结束。根据锁对象目前是否处于被锁定的状态决定是否撤销偏向,撤销后如果锁对象被锁定则升级为轻量级锁,如果没有被锁定则恢复到“未锁定”状态。
锁被线程t1持有
偏向锁且偏向t1
0 条评论
下一页