[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] 読書会議事録(3)




第4回 スレッドを利用した設計

日時 1999年3月13日(土) 10-16時

会場 目黒区立鷹番住区センター

この章に関しては、スレッド一般の注意点について書かれている。Javaに限定
した項目はあまり無い。強いて言えば「Threadクラスを継承するべきか」とい
う問題ぐらいか。だがこれは第2章p.59ですでに触れている。(結論としては
「Threadを継承するべきではない」ということにだった)

まず最初に多重スレッドの説明があるが、あまり具体的な説明は書かれていな
い。

つぎに同期について説明されている。

p.117-118の同期についてのまとめの中で、synchronizedなメソッドの中から
別のオブジェクトのsynchronizedなメソッドを呼べるとあるが、実際にこれを
やったらdeadLockにならないか、などの疑問が出た。

p.122 のdeadLockの説明で「その同期化メソッドを終了する前に、そのオブジ
ェクトの外でメソッドを呼び出します」という文章が意味不明だという疑問が
出された。

「外の」は「外で」ではないのか?

そもそもsynchronizedの説明が無い。なぜロックを獲得するのか?どういうタ
イミングで解除するのか?

戸松「Javaプログラムデザイン」にはこの問題が初歩から解説されている。

つぎに「値のゲートキーパーの戦略」と「オブジェクトのゲートキーパーの戦
略」が
説明されている。

値のゲートキーパーとは、カウンターなど限られた資源のカウントを増減させ
ている
部分を同期化することを指す。

オブジェクトのゲートキーパーとは、オブジェクトの集合を保持し、オブジェ
クトを追加・削除したりする部分を同期化することを指す。(本文中では「確
保または提供」となっている)

この2つについては短い例しか提示されていない。

つぎに、いろいろな種類のスレッドの例が紹介されている。

・単一スレッド
・優先順位つきオブジェクトスレッド
・優先順位付きメソッドスレッド
・優先順位付きオブジェクトスレッドと優先順位つきメソッドスレッドの組合
  せ

いろいろ紹介されているが、具体例のセンサーの管理システムの動作イメージ
が想像できないので、
いまひとつピンと来ない。

結論としては、単一スレッドで間に合うなら単一スレッドを使うのが良いと書
かれている。

つぎに「インターフェースアダプタ」が紹介されている。

かなり複雑なパターンだが、使えば便利そうだ。
だがやはり動いているイメージがわからない。

結論としては、動かしてみないとわからない、という意見が多かった。

p.141 でdispatcherが紹介されている。このdemelitとしては「内部の結合性
が貧弱になる」ということだそうだ。

もうひとつのインターフェースアダプタについては、p.145に「あるオブジェ
クトで異なるメソッドを呼び出したい複数のスレッドオブジェクトがある場合
には、常にインターフェースアダプタが必要になります」と書かれている。

なぜJavaにインターフェースアダプタが必要なのか?

Win32 APIなどでは、スレッドのエントリーポイントが指定できる。
(関数ポインターを使用)
Javaにはメソッドポインターは無いので、interfceを使うしか無いのでは?
という意見が出た。

p.151にいくつかの戦略がまとめてある。
「必要のあるものだけをクローズアップして同期化する戦略」では、
synchronizedする必要のある部分だけを抽出して独立したメソッドにして、
できるだけ同期の時間を短くすることが推奨されている。

synchronizedブロックによっても書けるが、外部から見てわかなないので、
できるだけメソッドとして独立させsynchronized宣言することを推奨している。

第5回 通知を利用した設計

日時 1999年4月17日(土) 10-16時

場所 目黒区立大岡山西住区センター

出席 えんどう、天野さん、布留川さん、高橋(智)さん、高橋(徹 )さん、橋口
さん、岸田さん、酒井さん、石黒さん、浅野さん

まず通知のいくつかのパターンが紹介されている。

・受動型通知
・タイマーベース型通知
・能動型通知

受動型通知とタイマーベース型通知はどこが違うのか?
後者はsleapしているだけ。

能動通知の例では、「java.util.Observerを使うべきか?」という問題が取り
上げられている。
結論としては、使うべきではないとされた。

本書ではinterfaceをひとつ定義し、それを監視側が実装し、
監視側の登録、削除、通知を管理する汎用のクラスを定義して使用している。

本書はJDK 1.0の頃に書かれた。
Delegetion-Listenerモデルのイベント通知が使えるJDK 1.1以降では
本書の方法は古くなっているかも知れない。

本書の原書第2版では、JavaBeans のListener通知モデルなどの説明が
追加された。

Observer/Observable の応用として、Repeaterが紹介されている。

また、通知とスレッドを組み合わせた例も紹介されている。

-- 
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)