文章目录
相关文章:
锁状态位之无锁
锁状态位之偏向锁
锁状态位之轻量级锁
锁状态位之重量级锁
1. 查看无锁的标识位
注意:这是大端显示
的
我们创建一个对象,没有上锁,来观察锁标识位:
import org.openjdk.jol.info.ClassLayout;
public class Test {
public static void main(String[] args) throws InterruptedException {
Object o = new Object();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
}
执行结果:
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) e5 a1 e7 27 (11100101 10100001 11100111 00100111) (669491685)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
分析:
2. 注意事项
jdk1.8时,默认开启偏向锁,创建一个对象的话, 对象会是可偏向
状态,即锁的标识显示是偏向锁,但是偏向线程ID
为空,等到后续真的发生需要加偏向锁时,会仅修改偏向线程ID
即可。
也就是说按道理,我们上面的例子不应该看到无锁的,那么是什么原因呢?
答案是:虽然默认开启偏向锁,但JVM会延迟去启动偏向锁,大约三四秒,此时对于系统来说,等价于没有开启偏向锁