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

标签 java synchronization

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

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 可见。对象?

最佳答案

是的,更改仍然可见 - 您仍在退出同步块(synchronized block),释放进程中的监视器,并且内存模型并不关心这是如何发生的 - 只是它确实发生。从 JLS section 17.4.4 的角度来看,它仍然是“显示器上的解锁操作” ,因此它与同一监视器上的下一个操作同步。

关于Java:同步方法异常和写入可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10363658/

相关文章:

java - 使用 Hibernate 实体的域实体?

java - 在 System.out 上同步

mysql - 跨数据库同步 persistence_token

java - 是什么原因导致 List.get(128) 不同

java - 查看 Java 数组的一部分

java - 如何避免多线程程序中不必要的阻塞?

.net - SynchronizationContext.Post() 是线程安全的吗?

swift - 从 Firebase 同步读取

java - 获取继承您的第三方类的实例

java - web.xml 经常从 Tomcat Manager servlet 中删除