1、通过反汇编
通过monitorenter 和monitorexit
0: ldc #2 // class me/snail/base/Demo
2: dup
3: astore_1
4: monitorenter
5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
8: ldc #4 // String Hello World.
10: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: aload_1
14: monitorexit
15: goto 23
18: astore_2
19: aload_1
20: monitorexit
21: aload_2
22: athrow
23: return
```
# 2、JAVA对象头
MarkWord存储GC分代年龄、 HashCode、锁状态标志、线程持有的锁
2、偏向锁状态
23bit 2bit 4bit 1bit 2bit
线程ID epoch 对象分代年龄 1 01
偏向锁是针对于一个线程而言的,线程获得锁之后就不会再有解锁等操作了
、
轻量级,是因为它仅仅使用 CAS 进行操作,实现获取锁
当竞争线程的自旋次数 达到界限值(threshold),轻量级锁将会膨胀为重量级锁。