我只是想到了这个问题,而且在任何地方都没有找到类似的问题。如果有没有找到的重复项,我可以关闭它。
这是一个简单的示例:

假设这是一个多线程方案,并且在写程序线程中,我想保证首先写入值A,然后将值B写入数据结构。

  public void writeMethod(...) {
     try {
        writeValueA(...);
     } finally {
        writeValueB(...);
     }
  }

我知道finallyexception handling and common for cleaning up resource很有用。但是我的问题是,使用finally关键字作为防止JVM重新排序我的代码/指令的显式方法是一种好/正确的做法吗?

最佳答案

方法

public void writeMethod(…) {
    try {
       writeValueA(…);
    } finally {
       writeValueB(…);
    }
}

在语义上等同于
public void writeMethod(…) {
    try {
       writeValueA(…);
    } catch(Throwable t) {
       writeValueB(…);
       throw t;
    }
    writeValueB(…);
}

它所做的一切就是确保如果writeValueB(…);抛出异常,那么writeValueA(…);也将被执行。如果它没有引发异常,那么与普通人没有什么区别
writeValueA(…);
writeValueB(…);

最值得注意的是,它不包含有关Java内存模型的任何其他语义。通常,在没有补充读者方面的努力的情况下,无法在编写者方面实现共享数据的线程安全修改。

09-26 14:32