この質問はしばらくの間私を悩ませますが、まだ完全な答えは見つかりませんでした (たとえば、これは C# の外部または内部の使い捨てリソースを try/finally で初期化するためのものです)。次の 2 つの 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 のバグ :)
2番目のアプローチはやや「慣用的」であると読みましたが、上記のシナリオではIMOに違いはなく、他のすべてのシナリオでは同等です。
だから質問:
2つの違いは何ですか?リソースの解放を懸念している場合 (特にマルチスレッド アプリケーションの場合)、どちらを選択する必要がありますか? なんで?
回答をサポートする Java/JVM 仕様の一部を教えていただければ幸いです。