Index: [Article Count Order] [Thread]

Date:  Tue, 3 Oct 2000 17:20:03 +0900
From:  tetsuya@....jp
Subject:  [XP-jp:01023] Re: ファイル	ロックユーティリティ
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <97BA340C0480D411BDA800062939A1890607C5@....jp>
Posted:  Tue, 3 Oct 2000 17:17:51 +0900 
X-Mail-Count: 01023

栗原です。

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