今天在看JVM的时候,发现对象内存布局中的对象头信息里的Mark Word有点奇怪.书上讲Mark Word字段可以通过标志位改变自己的存储内容.而不同的标志位对应有不同的状态,例如未锁定、轻量级锁定等.
存储内容 | 标志位 | 状 态 |
---|---|---|
对象哈希码、对象分代年龄 | 01 | 未锁定 |
指向锁记录的指针 | 00 | 轻量级锁定 |
指向重量级锁的指针 | 10 | 膨胀(重量级锁定) |
空,不需要记录信息 | 11 | GC标记 |
偏向线程ID、偏向时间戳 | 01 | 可偏向 |
看见这个表就觉得有点奇怪,怎么同一个标志位能够对应不同的存储内容呢?而且指定的状态还不一样.恶意揣测一下,可能是Java设计者设计这一块的时候,最后发现少了一个偏向状态,所以又要多用一位来标记可偏向.
biased_lock就是那个多出来的一位.
所以说可以看作lock和biased_lock共同来判断锁的状态,虚拟机运行时会先判断lock的标记,如果lock为01则再判断biased_lock的值;如果为其他就不需要进行biased_lock的判断了.