平鍋です.
On Wed, 27 Sep 2000 20:06:05 +0900,
tetsuya@....jp said:
> 栗原です。
> 自分で、ファイルのロックが必要と懸念点をあげているならば、
> その懸念を払拭してから進むべきですよね。
> # 不明点を明らかにしないとタスクを見積もれませんから。
> で、並行処理時のファイルロックユーティリティを作ってみました。
すばらしい.非常に美しいですね.(XP では美しさに惚れるのは禁物ですが)
幾つかコメントさせてください.
1) これは栗原さん自身もおっしゃってますが,Mutex という名前
がすこし一般的すぎると思います.割り切って,FileLock という
ほうがより具体的でよい気がします.プロセス間(inter-VM)同期に
使える,ということを示している名前を選ぶほうがよいでしょう.
また,Doug Lea の util.concurrent パッケージのクラス名とも
バッティングしますし.
# そういえば,Doug Lea の Concurrent Programming in Java,
# 2nd Edition という名著の日本語訳が出てますね.
# Doug Lea は JDK1.2 Collection が出る前に独自の
# collectionsパッケージを実装したり,ソフトウェアパターンの
# FAQを書いたり,今年の OOPSLA の program chair をしたり,
# C 言語の malloc 実装を書いたり,というスーパーな人です.
> attemptメソッドで、ロックファイルの作成を試みます。
> 引数には、ロックファイル作成までの最大待ち時間をミリ秒単位で指定
> します。
> もしも待ち時間を過ぎても、別プロセスによって作成されたロックファ
> イルが存在しているときは、例外AttemptTimeOutExceptionが投げられ、
> ロックが失敗します。
引数なしの attempt() もあるとよいですね.wait() や join()の
使用と同じで,引数なしは,引数 = 0 と同じで「永遠に」を示し
ます.その方が java.lang.Thread/Object と対称性があって一貫
性のある API になると思います.
# う〜ん,やはり util というか,汎用的なクラスを作る時,そのAPIは
# YAGNI ではいかんだろうなぁ,と思っている自分を発見しています.
> Mutex mutex = new Mutex("lock");
> try {
> mutex.attempt(100000);
> try {
> // 原子的に行われる処理
> } finally {
> mutex.release();
> }
> } catch (MutexException e) {
> // ロック獲得に失敗!
> }
2) 私は,以下のほうが好きです.
Mutex mutex = new Mutex("lock");
try {
mutex.attempt(100000);
// 原子的に行われる処理
} catch (MutexException e) {
// ロック獲得に失敗!
} finally {
mutex.release();
}
release() が,取得できなかったロックに対しても無害になること
を利用して(C++ の delete の仕様と似ている),try ブロックネス
トを減らせます.また,必ず attemptを含む try ブロックの
finaly にrelease を書け,と言う風にスタイルを強制しやすい仕
様と思います.
# う〜ん,やはり API は美しく,と考える自分がいます.
# XP っぽくないですね.
> 並行処理のテストの良いアイデアは何かありませんでしょうか?
> アドバイスお願いします、識者の方々。
確か,JUnit のドキュメントに並行性テストに関する記述がありま
したが,どなたかご存知ないですか?
以上