gpt4 book ai didi

java - 如何正确退出字节码监视器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:49 28 4
gpt4 key购买 nike

我正在阅读 JVM 规范,试图弄清楚如何正确处理监视器。他们在 the relevant section 中给出的示例看起来像这样:

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

我不明白为什么需要第二个异常表条目。如果 monitorexit 抛出异常,我真的想再次尝试退出监视器吗?据我所知,可能抛出的异常是 NullPointerExceptionIllegalMonitorStateException

最佳答案

有一个 Java Bug 已作为“不是问题”关闭 - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4414101 . (感谢汤姆安德森找到它。)

Bug 的评估部分非常有启发性。

首先讲的是处理“异步”异常;即 ThreadDeath 异常是(已弃用!)Thread.stop() 方法的实现方式。神秘的处理程序确保即使在 JVM 试图释放锁的临界点发生“线程停止”时,监视器锁也会被释放。

然后 Neil Gafter 补充说,根据 JLS,即使是假设的无限循环(如本问题中所述)也是正确的行为。 JLS 表示监视器将始终 在线程继续之前被释放。如果不可能做到这一点,那么将线程置于无限循环中比做任何其他事情都更正确。

关于java - 如何正确退出字节码监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249906/

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