JVM锁升级的过程
2020-12-03 10:00:30 0 举报
Synchronize锁升级过程说明
作者其他创作
大纲/内容
三、当偏向锁未启动时候,加锁,对象锁状态由“无锁”直接升级为“轻量级锁”
一、偏向锁延迟启动,因此此时锁状态为: 0 01,即无锁状态,或者说,此时只是个普通对象(延迟启动偏向锁的原因:JVM启动时会启动大量线程,此时使用偏向无意义,默认延迟4s)
偏向锁状态1 01
轻量级锁状态00
重量级锁状态10
四、64位JVM对象头中MarkWord的各位置的说明
MarkWord锁状态位说明
自旋十次或自适应自旋次数
Lock Record:由于synchronized默认是可以重入的,每个线程上自旋锁的时候,在自己的线程栈中生成一个LockRecord对象,哪个线程能在markword里写入自己LockRecord对象的指针,就算是持有了锁。锁重入的时候再次生成一个LockRecord,这样就记录了到底锁了多少次。
二、休眠,使得偏向锁启动成功,因此此时锁状态为: 1 01,即偏向状态(匿名偏向)
五、总结:锁升级流程图
public static void main(String[] args) throws InterruptedException { Object obj = new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); synchronized (obj) { System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }
六:关于可重入锁的JVM层面(对象头MarkWord)的实现原理 参考:https://www.cnblogs.com/boluopabo/p/13055090.html
public static void main(String[] args) throws InterruptedException { Object obj = new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
无锁状态0 01
GC标志11
public static void main(String[] args) throws InterruptedException { TimeUnit.SECONDS.sleep(5); Object obj = new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
0 条评论
回复 删除
下一页