synchronized 是 Java 内置的互斥锁,基于 JVM 实现。理解其底层机制对于编写高性能并发代码至关重要。我们可以从字节码、JVM 底层实现以及硬件层面三个维度来剖析。
字节码层面:monitorenter 和 monitorexit
使用 javap -v 反编译包含 synchronized 的代码,可以看到编译器生成的机器指令。
同步代码块
对于 synchronized(object) { ... },编译器会在同步块前后分别生成 monitorenter 和 monitorexit 指令。
public void method() {
synchronized(obj) {
System.out.println("hello");
}
}
对应的字节码大致如下:
public void method(); Code:
0: aload_0
1: getfield #2 // 获取对象引用 obj
4: dup
5: astore_1
6: monitorenter // 进入同步块,尝试获取锁
7: getstatic #3 // 获取 System.out
10: ldc #4 // 加载 "hello"
12: invokevirtual #5 // 调用 println
15: aload_1
16: monitorexit // 正常退出同步块,释放锁
17: goto


