S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

System#runFinalizersOnExitメソッドが非推奨な理由

APIに書いている、”終了時”とは”スレッドの終了時”という意味なのか?
”JavaVMの終了時”であれば問題ないような気がするが…

runFinalizersOnExit

@Deprecated
public static void runFinalizersOnExit(boolean value)

推奨されていません。 このメソッドは本質的に安全ではありません。ほかのスレッドが同時にそれらのオブジェクトを操作しているときに、生存中のオブジェクトに対してファイナライザが呼び出され、これにより、エラー動作またはデッドロックが発生します。

終了時のファイナライズを有効または無効にします。これを実行することによって、自動的に呼び出されていないファイナライザを持つすべてのオブジェクトのファイナライザが呼び出され、Java Runtime の終了前に実行されるようになります。デフォルトでは終了時のファイナライズは無効になっています。

セキュリティマネージャが存在する場合は、確実に終了が許可されるように、最初に引数を 0 として checkExit メソッドが呼び出されます。この結果、SecurityException がスローされることがあります。

パラメータ:
value - ファイナライズを有効にするか無効にするかを示す
例外:
SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの checkExit メソッドが終了を許可しない場合
導入されたバージョン:
JDK1.1
関連項目:
Runtime.exit(int), Runtime.gc(), SecurityManager.checkExit(int)


runFinalizersOnExitをtureにしてみた所、”JavaVMの終了時”に必ずfinalizeメソッドが呼び出されているのを確認した。”スレッドの終了時”の動作も確認してみたが、finalizeメソッドは呼び出されなかった。


問題は、一時ファイルクラス(TempFile)を作成して、そのfinalizeメソッドファイルシステムに作成した一時ファイルを削除しているが、finalizeメソッドが呼ばれる保証がないため、一時ファイルが残ってしまう。
GCでも、未参照のオブジェクトのfinalizeメソッドが呼ばれる保証もない。


結局一時ファイルを削除するバッチなりスレッドを用意して、最終更新日時から一定時間過ぎたもの削除するようにするしかないのか???