0

如果同步方法抛出异常,在抛出之前在其中进行的成员写入对其他线程是否可见?例如

class Foo
{
    private int x;

    public synchronized void foo()
    {
        x++;
        // some other code using x that throws RTE for a specific thread
    }
}

如果 Foo 的对象在线程 t1 和 t2 之间共享,并且 t1 抛出异常,在这种情况下,x 的最新值是否会刷新到主内存,以便 t2 在为该对象进入 foo 时对其可见?

4

1 回答 1

2

是的,更改仍然是可见的——你仍然在退出同步块,在进程中释放监视器,并且内存模型并不关心它是如何发生的——只是它确实发生了。在JLS 第 17.4.4 节中,它仍然是“监视器上的解锁操作” ,因此它与同一监视器上的下一个操作同步。

于 2012-04-28T12:56:41.367 回答