之前学JVM的时候没有太关注过对象头,以为不是很重要,今天学Java锁机制的偏向锁遇到了,特此回来补一下。
HotSpot虚拟机的对象头包括两部分信息,第一部分 用于存储对象自身运行时数据,如:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,而这部分被官方称为“Mark Word”
https://baijiahao.baidu.com/s?id=1639566514819627231&wfr=spider&for=pc
偏向锁获取过程:
-
访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01,确认为可偏向状态。
-
如果为可偏向状态,则测试线程ID是否指向当前线程,如果是,进入步骤5,否则进入步骤3。
-
如果线程ID并未指向当前线程,则通过CAS操作竞争锁。如果竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行5;如果竞争失败,执行4。
-
如果CAS获取偏向锁失败,则表示有竞争。当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。(撤销偏向锁的时候会导致stop the word)
-
执行同步代码。
注意:第四步中到达安全点safepoint会导致stop the word,时间很短。