synchronized 底层原理
synchronized 是 Java 内置的互斥锁,其底层基于 Monitor 实现。理解它的运行机制,对于掌握 JVM 并发编程至关重要。
1. 字节码层面:monitorenter 和 monitorexit
当我们使用 synchronized 关键字时,无论是修饰代码块还是方法,在编译后的字节码中都会生成对应的指令。
同步代码块
对于 synchronized(object) { ... },编译器会在同步代码块的前后分别生成 monitorenter 和 monitorexit 指令。
public void method() {
synchronized(obj) {
System.out.println("hello");
}
}
反编译后的字节码大致如下:
public void method(); Code:
0: aload_0
1: getfield #2 // Field obj:Lcom/example/Obj;
4: dup
5: astore_1
6: monitorenter // 进入同步块,尝试获取锁
7: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
10: ldc #4 // String hello
12: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: aload_1
16: monitorexit //






