我只是想到了这个问题,而且在任何地方都没有找到类似的问题。如果有没有找到的重复项,我可以关闭它。
这是一个简单的示例:
假设这是一个多线程方案,并且在写程序线程中,我想保证首先写入值A,然后将值B写入数据结构。
public void writeMethod(...) {
try {
writeValueA(...);
} finally {
writeValueB(...);
}
}
我知道
finally
对exception 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内存模型的任何其他语义。通常,在没有补充读者方面的努力的情况下,无法在编写者方面实现共享数据的线程安全修改。