首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们使用“同步”关键字时,为什么我们需要两次调用'monitorexit‘指令?

当我们使用“同步”关键字时,为什么我们需要两次调用'monitorexit‘指令?
EN

Stack Overflow用户
提问于 2019-06-12 06:00:30
回答 2查看 141关注 0票数 0

根据JVM规范,第3.14段同步,JVM两次调用监控指令。

我想知道为什么JVM需要这样的行为?为什么我们叫这个指令2次,而不是3次、4次或N次?

它可能与同步锁的类型有某种联系?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-12 07:00:30

代码不是两次“调用”monitorexit指令。它在两个不同的代码路径上执行一次。

  • 第一个代码页用于synchronized块中的代码正常退出时。
  • 对于块异常终止的情况,第二个代码页处于隐式异常处理路径中。

您可以将示例中的字节码编写为伪代码,如下所示:

代码语言:javascript
复制
void onlyMe(Foo f) {
    monitorEntry(f);

    try {
        doSomething();
        monitorExit();
    } catch (Throwable any) {
        monitorExit();
        throw any;
    }
}
票数 2
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56555542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档