如果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可见对象
答案 0 :(得分:2)
是的,更改仍然可见 - 您仍然退出同步块,在此过程中释放监视器,而内存模型并不关心它是如何发生的 - 只是它 发生。它仍然是JLS section 17.4.4方面的“在监视器上解锁操作”,因此它与同一监视器上的下一个操作同步。