java中我们都知道synchronized关键字是用来加锁,在多线程并发情况下实现同步的,那它底层是怎么实现的呢?
代码清单1-1
public class SyncTest {
public void test(){
synchronized(this){
System.out.println("-------call test() method---------");
}
}
}
代码清单1-1的字节码(通过javap -c SyncTest 查看字节码)
public class SyncTest {
public SyncTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public void test();
Code:
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3 // String -------call test() method---------
9: invokevirtual #4 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
12: aload_1
13: monitorexit
14: goto 22
17: astore_2
18: aload_1
19: monitorexit
20: aload_2
21: athrow
22: return
Exception table:
from to target type
4 14 17 any
17 20 17 any
}
注意:synchronized关键词是通过的monitorenter、monitorexit这两条指令来实现同步锁的。
代码清单1-2
public class SyncTest {
public synchronized void test(){
System.out.println("-------call test() method---------");
}
}
代码清单1-2的字节码(通过javap -c SyncTest 查看字节码)
Compiled from "SyncTest.java"
public class SyncTest {
public SyncTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public synchronized void test();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String -------call test() method---------
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
没有什么特别的指令,那通过javap -verbose可以看到更加清楚的信息
代码清单1-2的字节码(通过javap -verbose SyncTest 查看字节码)