这个问题困扰了我一段时间,但我还没有找到完整的答案(例如,这个问题是用于 C#在 try/finally 外部或内部初始化一次性资源)。考虑以下两个 Java 代码片段:
Closeable in = new FileInputStream("data.txt");
try {
doSomething(in);
} finally {
in.close();
}
和第二个变体
Closeable in = null;
try {
in = new FileInputStream("data.txt");
doSomething(in);
} finally {
if (null != in) in.close();
}
让我担心的部分是线程可能在获取资源的那一刻(例如打开文件)之间有些中断,但结果值没有分配给相应的局部变量。除了以下情况之外,线程是否有任何其他情况可能会在上述情况下被中断:
- 抛出 InterruptedException(例如通过 Thread#interrupt())或 OutOfMemoryError 异常
- JVM 退出(例如通过 kill、System.exit())
- 硬件故障(或 JVM 中的错误以获取完整列表 :)
我读过第二种方法更“惯用”,但在上述情况下,IMO 没有区别,在所有其他情况下它们都是平等的。
所以问题:
两者有什么区别?如果我确实担心释放资源(尤其是在大量多线程应用程序中),我应该更喜欢哪个?为什么?
如果有人指出支持答案的部分 Java/JVM 规范,我将不胜感激。