为什么每次使用 synchronized 关键字都不会在字节码级别创建监视器输入?
最佳答案
synchronized
关键字有两种用法:
当您在函数体内使用
synchronized(obj)
时,编译器会发出monitorenter
/monitorexit
字节码相关的监视器。如果整个方法被声明为
synchronized
,在字节码中该方法将被标记为ACC_SYNCHRONIZED
。在进入/退出方法时,JVM 将隐式进入和退出监视器。没有发出monitorenter
/monitorexit
字节码,也确实不需要。
考虑以下两种方法:
public class Sync {
public void f() {
synchronized (this) {
}
}
public synchronized void g() {
}
}
它们编译为:
public void f();
Code:
0: aload_0
1: dup
2: monitorenter
3: monitorexit
4: return
public synchronized void g();
Code:
0: return
如您所见,g()
在字节码中仍被标记为 synchronized
,因此 JVM 知道该做什么。
免责声明:这是我的编译器所做的。似乎不同的编译器可能会选择发出 monitorenter
/monitorexit
而不是使用 ACC_SYNCHRONIZED
。我不知道现有的编译器是否会这样做。
关于java - 为什么synchronized关键字不是每次都创建monitor enter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117115/