【发布时间】:2016-01-23 13:01:24
【问题描述】:
为类似 Java 的语言编写自己的编译器时,我无法编译 synchronized blocks。我想出了以下想法将它们简化为try-finally 块:
synchonized (obj) {
statements...
}
可以替换为
Object _lock = obj
_monitorEnter(lock)
try {
statements...
}
finally {
_monitorExit(lock)
}
其中_monitorEnter 和_monitorExit 代表MONITORENTER 和MONITOREXIT 指令。
我对@987654331@ 是如何编译的这个假设是正确的,还是我遗漏了什么?
编辑
我的实现之前对正文中的return 和throw 语句进行了一些特殊处理。基本上,它会在每个*RETURN 或THROW 指令之前手动加载所有lock 变量和MONITOREXIT 它们。这是由finally 块处理的,还是我还需要这些检查?
【问题讨论】:
-
是的,这是正确的。事实上,这是
java.util.concurrent.locks.Lock的精确 语法。 -
我不确定我是否理解你的想法。如果您是实现编译器的人,那么将
synchronized替换为try … finally并不会简化任何事情,因为您仍然是必须实现try … finally的人,不是吗?所以你仍然需要自己关心任何return声明。 -
@Holger 当然,但我必须两次实现相同的东西,所以犯错的方法是两倍。目前,同步字节码生成只是 try/finally 语句的特化。
-
所以更多的是平等对待他们,而不是用一个代替另一个。实际上,
synchronized和finally都是在字节码级别上没有等价物的构造,但具有相同的解决方法。通常,当尝试为 JVM 开发编译器时,强烈建议了解整个 “Compiling for the Java Virtual Machine” 章节(如果不是整个 JVM 规范)...
标签: java bytecode synchronized try-finally jvm-bytecode