栗原です。
firo [mailto:firo@....jp] wrote:
> 栗原さんのおっしゃっているのは、以下のようなことでいいでしょうか?
>
> 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を返すと
> 思いますが、それは問題ではないと思うのですが、、
これならいけるかも。
public void release() {
if (!create)
return;
if (lockFile.delete())
create = false;
}
protected void finalize()
throws Throwable {
if (create)
lockFile.delete();
}
[XP-jp:01022]のコードの一部をこのように変更すれば、GCが起動した
時点で必ずロックがリリースされます。
この辺でFixしてよろしいでしょうか?
---
Tetsuya Kurihara
tetsuya@....jp