Java:同步方法异常和写入可见性

时间:2012-04-28 12:53:28

标签: java synchronization

如果synchronized方法抛出异常,那么在该抛出之前对其进行的成员写入是否对其他线程可见? E.g。

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的最新值刷新到主存储器,以便当它进入foo时它对t2可见对象

1 个答案:

答案 0 :(得分:2)

是的,更改仍然可见 - 您仍然退出同步块,在此过程中释放监视器,而内存模型并不关心它是如何发生的 - 只是它 发生。它仍然是JLS section 17.4.4方面的“在监视器上解锁操作”,因此它与同一监视器上的下一个操作同步。