gpt4 book ai didi

java - Synchronized Block 能否简化为字节码级别的 Try-Finally Block?

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:45 25 4
gpt4 key购买 nike

为类 Java 语言编写我自己的编译器时,我在编译 同步块(synchronized block) 时遇到了问题。我想出了以下想法来将它们简化为 try-finally block :

synchonized (obj) {
statements...
}

可以替换为

Object _lock = obj
_monitorEnter(lock)
try {
statements...
}
finally {
_monitorExit(lock)
}

其中 _monitorEnter_monitorExit 代表 MONITORENTERMONITOREXIT 指令。

我对 synchronized 的编译方式的假设是否正确,还是我遗漏了什么?

编辑

我的实现之前对正文中的 returnthrow 语句进行了一些特殊处理。基本上,它会在每个 *RETURNTHROW 指令之前手动加载所有 lock 变量和 MONITOREXIT 它们。这是由 finally block 处理的,还是我仍然需要这些检查?

最佳答案

您的假设是正确的。 Java语言中的synchronized block 是通过monitorentermonitorexit指令实现的。您可以查看 JVM 规范详细信息 here .

Synchronization in the Java Virtual Machine is implemented by monitor entry and exit, either explicitly (by use of the monitorenter and monitorexit instructions) or implicitly (by the method invocation and return instructions).

编译器生成的字节码将处理在 synchronized 体内抛出的所有异常,因此您的 try-finally 方法在这里可以正常工作。

Specification finally 语句没有说明任何有关释放监视器的信息。第一个链接中提供的示例显示了包装在 synchronized block 中的简单方法的字节码。如您所见,处理任何可能的异常以确保 monitorexit 指令执行。您应该在编译器中实现相同的行为(编写将在 finally 语句中释放监视器的代码)。

void onlyMe(Foo f) {
synchronized(f) {
doSomething();
}
}

Method void onlyMe(Foo)
0 aload_1 // Push f
1 dup // Duplicate it on the stack
2 astore_2 // Store duplicate in local variable 2
3 monitorenter // Enter the monitor associated with f
4 aload_0 // Holding the monitor, pass this and...
5 invokevirtual #5 // ...call Example.doSomething()V
8 aload_2 // Push local variable 2 (f)
9 monitorexit // Exit the monitor associated with f
10 goto 18 // Complete the method normally
13 astore_3 // In case of any throw, end up here
14 aload_2 // Push local variable 2 (f)
15 monitorexit // Be sure to exit the monitor!
16 aload_3 // Push thrown value...
17 athrow // ...and rethrow value to the invoker
18 return // Return in the normal case
Exception table:
From To Target Type
4 10 13 any
13 16 13 any

关于java - Synchronized Block 能否简化为字节码级别的 Try-Finally Block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34963760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com