当前位置: 首页 > 面试题库 >

Java中实例方法同步的等效代码

池兴邦
2023-03-14
问题内容

在讨论Java同步问题时,有人评论说以下片段不是等效的(可能会编译为不同的字节码):

public synchronized void someMethod() {
  //stuff
}

public void someMethod() {
  synchronized (this) {
    //stuff
  }
}

它们相等吗?


问题答案:

尽管我测试过的编译器(Java 1.6.0_07和Eclipse 3.4)生成了不同的字节码,但它们在功能上是等效的。第一个生成:

// access flags 33
public synchronized someMethod()V
  RETURN

第二个生成:

// access flags 1
public someMethod()V
  ALOAD 0
  DUP
  MONITORENTER
  MONITOREXIT
  RETURN

(感谢ASM进行字节码打印)。

因此,它们之间的差异一直保持到字节码级别,并且取决于JVM是否使它们的行为相同。但是,它们确实具有相同的功能效果-
请参阅Java语言规范中的示例

应该注意的是,如果该方法在子类中被覆盖,则它不一定是同步的-因此在这方面也没有区别。

我还运行了一个测试来阻止尝试访问监视器的线程,以比较它们在线程转储中的堆栈跟踪情况,它们都包含有问题的方法,因此两者之间也没有区别。



 类似资料:
  • 本文向大家介绍java中的 toString()方法实例代码,包括了java中的 toString()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 前言:       toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据。   最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理。   处理要求把集合数

  • 请看下面给我带来麻烦的方法: 然后是run方法:

  • 问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们

  • 问题内容: GlobalVariables类包含在我的框架中使用的不同变量,其中之一是WebDriver实例: GlobalInitializer包含用于初始化所有GlobalVariable的方法: //一些其他方法来初始化其他全局变量。} 我有许多GetElement类,它们使用驱动程序实例获取UI控件元素,例如: 我还有其他类在UI控件上执行一些操作(此类也使用全局变量),例如: 我在tes

  • 本文向大家介绍Java中覆盖finalize()方法实例代码,包括了Java中覆盖finalize()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java中关于覆盖finalize()方法的一次尝试,具体实现如下。 测试代码 执行结果: finalize methode executed yes,i am still alive Exception in thread "

  • 问题内容: Go中是否有类似java finalize的方法?如果我有一个类似的类型结构 如何确保在垃圾回收对象时关闭文件? 问题答案: iirc。但是它被认为是一件坏事,并且不能保证在程序退出之前就可以运行 编辑:如下所述,当前程序包已在文件上调用。但是,不应该依赖。作为一个示例,我有一个类似文件服务器的应用程序,但我忘记了关闭打开的文件。在GC选取并打开其终结器之前,该过程通常可以获取约300