今天在测试进入偏向锁之后调用锁对象的hashCode()会不会升级为重量级锁,结果无意中测试出来了,synchronized进入重量级锁之后,即使临界代码执行完了也并不会立即释放锁
先来看看对象头各个bit的含义
上代码
public class ObjectHeader {
public static void main(String[] args) throws InterruptedException {
Object monitor = new Object();
System.out.println("========================没加锁之前=============================================");
// 设置该JVM参数将偏向锁的延时设置为0
// -XX:BiasedLockingStartupDelay=0
synchronized (monitor) {
System.out.println(ClassLayout.parseInstance(monitor).toPrintable());
System.out.println("========================调用hashCode之前=============================================");
System.out.println(ClassLayout.parseInstance(monitor).toPrintable());
monitor.hashCode(); // 调用锁对象处于偏向锁状态调用hashCode() 会升级成重量级锁
System.out.println("========================调用hashCode后=============================================");
System.out.println(ClassLayout.parseInstance(monitor).toPrintable());
}
System.out.println("========================synchronized代码块结束=============================================");
System.out.println(ClassLayout.parseInstance(monitor).toPrintable());
Thread.sleep(1000); // 在我电脑上是1000左右会释放锁,根据自己的情况进行赋值
System.out.println("========================等待一秒之后=============================================");
System.out.println(ClassLayout.parseInstance(monitor).toPrintable());
}
}
分析结果
这是我自己测试出来的结果,欢迎大佬来纠正。