Servlet/JSPでロックファイルを作成するにはどうするんだろうと思ってちょっと調べてみた。
テキストファイルへの同時書き込みを防ぐという手もあるようだが、10分以上たったロックファイルを強制的に削除したり、delete()メソッドを使っているあたりがちょっとあやしい。ロックファイルプロトコルの実装にはJava2 SDK のドキュメントではFile.createNewFile()とFile.deleteOnExit()とを組み合わせるというような記述があるので、そうした方がいいだろう。しかし、File.deleteOnExit()はVMが終了するときにしかファイルを削除しないのでServlet/JSPでは使えない。
もうちょっと調べてみたところ、java.nio.channels.FileChannel.lock() を使うのが良さそうだ。しかしこれも「ファイルロックは Java 仮想マシン全体のために保持されます。これらは、同一仮想マシン内の複数スレッドによるファイルへのアクセスを制御するには適していません。」なんて書かれている。もっと言えば、「他の言語で書かれたプログラムが動作するプロセスのためにも保持される」のだろう。ちょっと強力すぎる感じだ。
結局のところ、マルチスレッド対応のSingletonを用意して、そいつにキーとしてファイル名を渡すとロック用オブジェクトを返すようなメソッドを持たせて、synchronizedで排他制御するのが良いのでは、という結論に達した。