【问题标题】:Java: synchronized method exception and write visibilityJava:同步方法异常和写入可见性
【发布时间】:2012-04-28 20:56:41
【问题描述】:

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

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

【问题讨论】:

  • 我假设您打算同步您的 foo 方法?
  • @Jon Skeet 哎呀!做出改变。谢谢。
  • 如果维护一个堆栈来存储你的方法的使用信息,那么下次当任何其他线程要执行时,它可以检索上次发生的信息。

标签: java synchronization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2021-09-02
    • 2012-10-12
    • 2019-03-19
    • 2012-01-12
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多