发布于 2019-06-12 07:00:30
代码不是两次“调用”monitorexit指令。它在两个不同的代码路径上执行一次。
synchronized块中的代码正常退出时。您可以将示例中的字节码编写为伪代码,如下所示:
void onlyMe(Foo f) {
monitorEntry(f);
try {
doSomething();
monitorExit();
} catch (Throwable any) {
monitorExit();
throw any;
}
}发布于 2019-06-12 06:10:33
如果您查看代码,它应该在第10行之后结束,在第10行中它将返回语句
9 astore_3 //退出与f 10 goto 18 //相关的监视器完成通常13 aload_2 //在任何抛出的情况下,在此结束为14 aload_2 // Push局部变量2 (f) 15 monitorexit //确保退出监视器!16 aload_3 // Push引发的值.17 athrow // ...and将值重新抛给调用方18返回//返回在正常情况下
但是,如果再次返回调用失败,则会添加额外的警告检查,monitorexit
https://stackoverflow.com/questions/56555542
复制相似问题