java - 为什么synchronized关键字不是每次都创建monitor enter

标签 java

为什么每次使用 synchronized 关键字都不会在字节码级别创建监视器输入?

最佳答案

synchronized 关键字有两种用法:

  1. 当您在函数体内使用 synchronized(obj) 时,编译器会发出 monitorenter/monitorexit 字节码相关的监视器。

  2. 如果整个方法被声明为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/

相关文章:

java - Libgdx TileMap : How should I do to load my ressources efficiently?

java - 如果事件是从另一个监听器发布的,则忽略 TransactionalEventListener

java - "log4j: Error Could not find value for key log4j.appender.SQL_APPENDER"背后可能的原因是什么

java - 自动排序依赖关系

java - Java 中的抑制异常

java - 在 Google App Engine 上选择 Java 还是 Python

java - 如何在网络应用程序中动态更新(热插拔) jar ?

java - Dphibernate。代理初始化为 false

java - 如何获取有关 Java 文件中表达式的类型信息?

java - java中./../Path是什么意思?