尽管我测试过的编译器(Java 1.6.0_07和Eclipse 3.4)生成了不同的字节码,但它们在功能上是等效的。第一个生成:
// access flags 33public synchronized someMethod()V RETURN
第二个生成:
// access flags 1public someMethod()V ALOAD 0 DUP MonITORENTER MonITOREXIT RETURN
(感谢ASM进行字节码打印)。
因此,它们之间的差异一直保持到字节码级别,并且取决于JVM是否使它们的行为相同。但是,它们确实具有相同的功能效果-
请参阅Java语言规范中的示例。
应该注意的是,如果该方法在子类中被覆盖,则它不一定是同步的-因此在这方面也没有区别。
我还运行了一个测试来阻止尝试访问监视器的线程,以比较它们在线程转储中的堆栈跟踪情况,它们都包含有问题的方法,因此两者之间也没有区别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)