synchronized关键字修饰方法和代码块时JVM底层做了什么
一、修饰代码块
参考如下的代码块,通过对下面代码的字节码文件(.class文件)进行反编译,可以得到指令文件。
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("synchronized 代码块");
}
}
}
指令文件如下,可以看出synchronized同步语句块使用的是monitorenter和monitorexit指令。其中monitorenter指向同步代码块的开始位置,monitorexit指向同步代码块的结束位置。
二、修饰方法
参考如下的代码:
public class SynchronizedDemo2 {
public synchronized void method() {
System.out.println("synchronized ⽅法");
}
}
反编译如下,可以发现修饰方法时候没有使用monitorenter和monitorexit指令,使用的是ACC_SYNCHRONIZED标志。该标志指明了该方法是一个同步方法,JVM通过ACC_SYNCHRONIZED访问标志来判断当前方法是否是同步方法,从而执行相应的同步调用。