Index: [Article Count Order] [Thread]

Date:  Tue, 3 Oct 2000 17:57:19 +0900
From:  Nakamura Tadashi <Nakamura.Tadashi@....jp>
Subject:  [XP-jp:01026] Re: ファイルロックユーティリティ
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <A9771C1A05F3D211BA680008C707B29D0244CD93@ODAPEXC1>
Posted:  Tue, 3 Oct 2000 17:55:03 +0900 
X-Mail-Count: 01026

中村@セイコーエプソンです.

> とだけあるので、File#delete()が先に呼び出されていても、JVMが終了
> した時点でもう一度ファイル削除が試行されるのではないでしょうか?
矢崎さんの指摘があって,簡単なプログラムでテストしてみた結果,そのとおりでし
た.

> # 私の認識違いでしたら、ご指摘ください。
ということで,こちらの方が分かっていませんでした.
中村の方法では,プロセスの稼働中にリソースの解放や再取得を行う場合には対応で
きませんでした.
これでは困るという話だったのですね.

>         // ここで呼び出すということですよね?
>         // 中村さん?
>         // LockFile.deleteOnExit();
そのつもりでした.これでは駄目なのですね.了解です.

余談ですが,Runtime#addShutdownHook()とRuntime#removeShutdownHook()を使うと
同じようなことがもっと適切に出来きますね.
こんな感じかな.

    // nested classでもいいかな
    class ShutdownHook extends Thread {
        private final File lock;
        ShutdownHook(File lock) {
            this.lock = lock;
        }

        public void run() {
            this.lock.delete();
        }
    }


    publc class FileLock {
        private final Thread shotdownHook;

        public FileLock(final String nameOfLockFile) {
            this.lockFile = new File(nameOfLockFile);
            this.shutdownHook = new ShutdownHook(this.lockFile);
        }

        // ...

        // 引数とtry-catchの中身をちょちょっといじって・・・
        private void attemptCreateLockFile(long milliSec) {
            // ...

        	try {
                long oldTime = System.currentTimeMillis();
                while (milliSec >= 0) {
        	        if (this.create = this.lockFile.createNewFile()) {
// (1)
 
Runtime.getRuntime().addShutdownHook(this.shutdownHook); // !!
                        break;
                    } else {
                        long nowTime = System.currentTimeMillis();
                        if ((milliSec -= nowTime - oldTime) <= 0)
                            throw new AttemptTimeOutException();
                        oldTime = nowTime;
                    }
                    Thread.sleep(this.intervalTime);
                } catch (...) {
                    // ...
            }

            // ...
        }

        public void release() {
            if (!this.create) return;
            if (this.lockFile.delete()) {
                Runtime.getRuntime().removeShutdownHook(this.shutdownHook);
// !!
            }
        }
    }

#ううっ,やりすぎか?
#これじゃ,モットーに反するかな?< see signature (^^;
#XPの思想とは・・・?


話は変わりますが,

> package XP.jp.co.esm.wiki.extremedomo.util;
このパッケージ名はわざとなんでしょうか?
最初の経緯を分かっていないので.
#ちょっと気になる・・・

>     private boolean create = false;
これは上のコード(1)のようにFile#createNewFile()のリターンを入れた方が良いの
ではないでしょうか?
その時点でファイルが作成されているのですし.
それと,デフォルト値での初期化は要らないと思います.
#C/C++の流れからすると書きたくなりますが.
#これでは2度初期化することになるので,効率は良くないです.
#もちろん大量に作成されるオブジェクトでなければ,問題ないのですが.

-----
NAKAMURA, Tadashi
Network Technology Laboratory
Information Tech. R&D Dept.
SEIKO EPSON Corp.
tel +81-42-535-1733 fax -1734

Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.
                                              by M.F.