1. Synchronized 字节码分析
前面我们已经知道了 Synchronized 在使用的时候有两种方式,一种修饰方法,一种是同步块的方式。
示例:1
public class SyncDemo {
public synchronized void a() {
//
}
public void b() {
synchronized(this) {
//code
}
}
}
可以看出示例已经显示了这两种方式,我们可以通过这段代码的字节码来具体分析下它的底层工作原理。
可以运行两个命令:
javac SyncDemo.java
javap -v SyncDemo
我们可以看到如下的字节码文件:
{
public class SyncDemo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #3.#16 // java/lang/Object."<init>":()V
#2 = Class #17 // SyncDemo
#3 = Class #18 // java/lang/Object
#4 = Utf8 <init>
#5 = Utf8 ()V
#6 = Utf8 Code
#7 = Utf8 LineNumberTable
#8 = Utf8 a
#9 = Utf8 b
#10 = Utf8 StackMapTable
#11 = Class #17 // SyncDemo
#12 = Class #18 // java/lang/Object
#13 = Class #19 // java/lang/Throwable
#14 = Utf8 SourceFile
#15 = Utf8 SyncDemo.java
#16 = NameAndType #4:#5 // "<init>":()V
#17 = Utf8 SyncDemo
#18 = Utf8 java/lang/Object
#19 = Utf8 java/lang/Throwable
{
public SyncDemo();
descriptor:()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
public synchronized void a();
descriptor:()V
flags: ACC_PUBLIC, ACC_SYNCHRONIZED
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 5: 0
public void b();
descriptor:()V
f