矢崎です。
Nakamura Tadashiさん wrote:
> 中村@セイコーエプソンです.
>
> > あう。誤解されています。
> ありゃ.
>
> > このFileLockクラスは、それぞれ別のJVMからのアクセスを想定して作成され
> > ています。
> > よって、File#deleteOnExit()を指定することで、JVM終了時に必ずロックファ
> > イルが削除されてしまうと都合が悪いのです。
ええと、確かにここはややこしいところですね。
栗原さんのおっしゃっているのは、以下のようなことでいいでしょうか?
1.今JVMを2つ立ち上げた、JVM-AとJVM-Bとする。
2.JVM-AでFileLockを使用して、"config.txt"というファイルを排他的に
作成。成功。
3.JVM-BでFileLockを使用して、"config.txt"というファイルを排他的に
作成。JVM-AのFileLockが同名のファイルを先につくって、かつ、まだ
リリースしていないので、失敗。
4.JVM-AのFileLockがリリース。"config.txt"は削除。
5.JVM-BのFileLockが"config.txt"の作成をリトライ。今度は成功。
6.JVM-Aを終了。しかし、JVM-BのFileLockはまだ、リリースしていない。
で、6の時点で、AのJVMが終了するため、deleteOnExit();がきいて、
"config.txt"は削除されてしまう。ところが、Bはまだ使っているつもり
でいて、あれれ・・・ファイルがない!
~~~~~~~~~~~~~~~~~~~~
中村さんの投稿を読んで、触発されてアイディアが1つわきました。
デストラクタで、
if (create == true) lockFile.delete();
というのは、どうでしょう?
もちろん先にreleasaされていれば、上記deleteはfalseを返すと
思いますが、それは問題ではないと思うのですが、、
--
矢崎博英 firo@....jp