java - JVM 同步 Finally block

标签 java multithreading jvm synchronized try-finally

查看 Java Virtual Machine Specification编译后的代码告诉我们如何 "synchronized" block 是用java实现的。以下代码:

public void testSync()
{
    Object obj = getSomeObject();
    synchronized (obj) { doSomething(); }
}

...大致相当于这个伪代码:

public void testSync()
{
    Object obj = getSomeObject();
    Object __temp = obj;
    monitorenter __temp;
    try { doSomething(); }
    finally { monitorexit __temp; }
}

...有一个异常(exception)。

出于某种原因,异常表显示了两个 finally 处理程序。例如:

  Exception table:
     from    to  target type
        12    20    23   any
        23    25    23   any

第一个处理程序在我期望的位置,但第二个处理程序实际上用于第一个处理程序的 finally block ,如果它捕获到异常,它会执行相同的处理程序。您可以通过以下方式将其形象化:

try { doSomething(); }
finally { beginTry: try { monitorexit __temp; } finally { goto beginTry; } }

有人知道这是为什么吗?如果它只是 finally block ,则表中的第二个条目将不存在。此外,如果 finally block 已经抛出异常,我看不出有任何可能的理由要再次执行它。

谢谢, 布兰登

最佳答案

如果要在多次尝试释放监视器失败和继续不释放监视器之间做出选择,两种选择都会导致死锁;只是如果您不释放就继续进行,那么直到下一次尝试获取监视器时才会发生死锁,并且该问题可能与最初的失败相去甚远。同样尝试释放监视器可能最终会成功,而让监视器不被释放是一场灾难。所以你最好重试。

关于java - JVM 同步 Finally block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121402/

相关文章:

java - 如何在 testng 中保持依赖测试属于不同类的顺序

Java 递归 System.out.println()

c++ - QT多线程和更新GUI

java - 远程 JVM 中对象的 JDI 镜像的生命周期

java - 如何在Eclipse中调试openjdk 9(主要是hotspot)源码?

java - 即使输入无效,Ajax 回调 onstart 也能工作

Java/JNI/MSVC java.lang.UnsatisfiedLinkError 到我的 DLL 函数

java - 为什么 JVM 消耗的内存比指定的 -Xms 少?

java - Bow/BowBack 线程锁解释

c++ - 非常适合 Xeon-phi 众核架构的应用程序