锁的验证- 无锁->偏向锁->轻量级锁->重量级锁->无锁过程
一、JVM 设置参数
# 开启偏向锁
-XX:+UseBiasedLocking
# 关闭偏向锁延迟
-XX:BiasedLockingStartupDelay=0
# 查看所有的 JVM 参数
-XX:+PrintFlagsFinal
# 设置重偏向阈值
-XX:BiasedLockingBulkRebiasThreshold=20
# 批量重偏向距离上次批量重偏向的后重置的延迟时间
-XX:BiasedLockingDecayTime=25000
# 设置批量撤销阈值
-XX:BiasedLockingBulkRevokeThreshold=40
在 JVM 启动的时候会有很多线程在后台运行,例如 GC 线程,Finalizer 线程,VM Thread 线程等,会用到很多同步操作,所以在启动的前 4 秒默认创建的对象都不支持偏向,因为有默认参数
-XX:BiasedLockingStartupDelay=4000
二、无锁状态
public void test1(){
Object model2 = new Object();
System.out.println(ClassLayout.parseInstance(model2).toPrintable());
System.out.println("hash: -----" + model2.hashCode());
// 偏向锁
System.out.println(ClassLayout.parseInstance(model2).toPrintable());
binaryToDecimal(model2.hashCode());
}
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 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
hash: -----1975358023
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 47 92 bd (00000001 01000111 10010010 10111101) (-1114487039)
4 4 (object header) 75 00 00 00 (01110101 00000000 00000000 00000000) (117)
8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
header中前8个字节按照平时习惯的从高位到低位的展示为:
00000000 00000000 00000000 01110101 10111101 10010010 01000111 00000001
对照上图。最后3位001,代表无锁状态
中间31位(01110101 10111101 10010010 01000111)换算成10进制,即为上图打印的hash值:1975358023
偏向锁
public static void main(String[] args) throws InterruptedException {