在讨论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