読書会(Javaスレッドプログラミング)第2回議事録

[ 戻る ]


Java スレッドプログラミング を読む会  第2回

日時 10:00 - 16:50
場所 新宿
参加者(敬称略)  高橋(徹)、高橋(智)、秋元、武川、佐藤、橋本、
水本、辻、布留川、石黒
(以上、紹介順...だったんですけど途中から来た方の順番は適当です。)

書記 武川

読み手 秋元さん

1.3 設計要因

1.3.1 安全性

◇フォーマルメソッドとはなにか?

形式的仕様記述言語などを使った手法
論理(数学)的に正しさを証明する手法
ペトリネットみたいなもの?

1.3.1.1 属性と制約

◇boudedbufferとはなにか?
 有限バッファのことではないか。

◇スタックのトップが常に変数にあるとは限らないということはどういうこと?
 スタックという概念を実装するオブジェクトが、常に変数でスタックのトップを保
持する必要するはない。例えば片方向のリンクリストで実装する場合など。

◇「スタックのトップの話」と「属性と制約の話」と関係ないのでは?
 属性が直接的に表現されているわけではないということで属性のはなしに関連して
いる?

1.3.1.2 内部的データ表現に関する制約

◇"ing"で終わる名前を持つ値から列挙型の変数を持つ。って断言しているが、ほん
とうか?
 あまり使われるのを見たことがない。
 確かに便利だとはおもう。

◇ 状態変数が沢山あるから並列処理は難しい
 タイミングを考えると値のキャッシュも難しい。

◇P51 の最初のitem(◆オブジェクトは、...)は例ではないのではないか?
 わかりやすく説明した一般的な例ではないか?

◇バージョン追跡変数にオブジェクトリファレンスやシグネチャオジェクトとはどう
いうことか?
 シグネチャオブジェクトはチェックサムなどのように状態が変わったことをチェッ
クするためのオブジェクトではないか。
 ステートパターンなどではオブジェクトリファレンスを過去のバージョンに戻すた
めに使用する。
 (武川:他にもいろいろあったんですけど、ごめんなさい。よくわかなかったで
す。)

1.3.2 活動性

◇P.51 の注1は何をいっているのか?
 宿題1

◇デッドロックとネストしたモニタによるロックアウトの違いは?
 3.4節でわかるだろう。

1.3.3 パフォーマンス

◇モニタとはなにか?
 Object.wait() 、Object.notify()、Object.notifyAll() を使うもの。
 意識的に同期を取るために使うものがモニタ。
 ちなみにロックは排他制御を実現するもの。
 セマフォ、ランデブー、なども仲間なのか? →並列処理の本を見るべき?
 モニタはロックと待機セットによって実装されている。(P.209)

---------------------------------------------------------------

昼休み 11:50 - 12:55
  近くのハンバーク屋さんで昼食
  4人x2にわかれたので、もうひとつのグループの話題はわかりません。

そこで出た話題で覚えていることを書いておくと、

 System.out.printlnは非常に重い処理だ。
 java.text.SimpleDateFormatは、スレッドセーフではない。
 プログラムが上手く動かない言い訳としてWindowsは最適だ。
 (Windowsの方がおかしいみたいですね。サービスパックを入れると直る可能性があ
りますといえば納得してもらえる?)
 javahouse-brewers MLにメールするのは結構恐い。

---------------------------------------------------------------

1.3.4 再利用性

1.3.4.1 クローズサブシステム

◇P59の1行目 「デッドロックが決して発生しないように、そのサブシステムでは別
のスレッドから2つが同時にアクセスされないような場合がこれにあたります。」の
意味がよくわからない。
 コードがどのようにロックにアクセスするかということが、スタティックな情報で
存在すれば、デッドロックが発生しないことがわかる。ということではないか。

1.3.4.2 オープンシステム

◇P59下から5行目 「しかし、JVMでは、従わないコンポーネントがシステムの整合性
に致命的なダメージを与えることはできません」 の意味は?
 どこの範囲のことをいっているのかよくわからない。
 クラスファイルじゃないものをJVMが実行できないというレベルのこと?
 したがわないコンポーネントは、セキュリティマネージャではじかるからというこ
と?
 (武川:ここも結局よく理解できませんでした。)

◇P.61 14行目 : 動的なコンパイルとはなにか?
 必要なクラスをロード時にコンパイルまでもすることらしい。

◇P.61 14行目 「あたかもクローズであったかのように」....の意味は?
 例えば、finalなクラスという前提に行なうようなプログラム上の最適化をfinalで
ないクラスに対して、実行時に継承関係を識別してfinalとして扱えるなら、最適化
するようなことを意味しているのではないか。

◇ポリシーによる設計とは?
 プログラムが従わないとうまく動作しない約束事
 どっちかというとコード(コンパイラ)レベルでは制約できなくて、文書や口頭で開
発者同士が守るようなルール。

1.3.4.3 文書化

◇P62の表  /** ではじまっているが、JavaDoc形式に出力するツールがあるのか?
 PRE POST などのようなコメントを入れとくとソースのチェックをいれてくれるよう
なツールはある。ただし、JavaDocとは関係ない。(ASSERTのようなもの)
 @thread safe タグとかあると便利だと思う。(高橋さんが作る?)

◇リファクタリングとは?
 インターフェースを替えずに実装を向上(拡張性をあげる、シンプルにするなど)た
めの手法

◇タイムスレッドダイアグラムって何?
 P5の図のことらしい。

1.4 事前/事後パターン

1.4.1 階層化

◇Capacity , Volumeの意味がよくわからない。
 説明はP31参照のこと。

1.4.2 アダプター

◇P69 コメント finally 句の中の事後チェック....の意味がよくわからない。
 オブジェクトとして異常になるのと、オーバーフローとアンダーフローは区別必要
がある。
 catchをそこに書く理由がよくわからない。→作法か?
 実際にコードを考えてみる。宿題2。

◇getCapacity が syncronizedしていないのはなぜ?
 delegate のコードが同期されていないならば、干渉が起こるではないか?
 syncronizedがあるメソッドが実行中でも非synchronizedメソッドはロック待ちしな
い。(しらなかった)
 このソースはtransferWaterに事前、事後チェックを追加するためのサンプルにすぎ
ないので、そこまで深く考える必要はないのでは?

◇ソースをクラス図にかくとどうなるのか?
 ちょっとわかりにくい。
 オブジェクト図で書くべきか?

1.4.3 サブクラス化

◇P71 これらの問題の多くは、..... の 意味
 delegateのメソッドの引数にAdapterのインスタンスを渡すようなことをすること
で、同一性チェックなどをうまくごまかすということか?
 (武川:すいません。ここも理解できてないので間違ったことを書いているような気
がします)

◇フォワードテクニックとはなにか?
 単に処理をなにもせずに他のオブジェクトに転送すること?

1.4.3.1 テンプレートメソッド

◇テンプレートメソッドの利点は?
 事前事後の管理に依存している(変更する個所が少ない)場合にはテンプレートメ
ソッドが使える。

1.4.4 メソッドアダプタ

◇クロージャとはなにか?
 引数の中に処理や、無名クラスを渡すことができるらしい。
 smalltalkで使用される。

◇P74のソースは何が嬉しいのか?
 このソース自体には利点はない。そのことがソースの前の本文に説明されていた。

◇リフレクティブなインターセプションテクニックとは?
 メソッドのエントリポイントを探しだして、自分の処理を埋め込むというようなこ
とか?
 処理の途中(実行時)にコードを入手(インターセプション)し、そのコードを書き換
え(リフレクション)るようなことらしい。
 reflectiveには思慮深いという意味もある。

1.4.5 参考文献

◇アナリシスパターンという本は面白いのか?
 良い本だった。

◇アスペクト指向とはなにか?
 オージス総研のWebサイトのオブジェクト指向の広場というページに情報がのってい
る。
 クラスの継承関係とはまったく別に、ある機能を簡単にクラス群に追加するような
ものらしい。

◇あんまり関係ない話だがamazon.co.jpで洋書が安くかえるらしい。

2 排他

2.1 不変性

2.1.1 適用

2.1.1.1 抽象データ型

2.1.1.2 データ値のコンテナ

2.1.1.3 共有

2.1.2 生成
◇コンストラクタが初期化に関連した処理以外を行なった場合に困る例は?
 ウィンドウコンポーネントを生成時にウィンドウサイズを取得しようとしても
isVisible()が発行する までウィンドウサイズが確定できないので困る。
 後ろに例がのっていたと思う。

2.2 同期
◇MultiProcessorでは同時に同じアドレスにメモリアクセスを行なえるのだろうか?
 バスの競合が起きるので、無理ではないだろうか?
 JVMはMultiProcessorに関連するバグがけっこうあるらしい。

2.2.1 メカニズム

2.2.1.1 オブジェクトとロック

2.2.1.2 同期メソッドと同期ブロック

◇OuterClass なんてキーワードがあったか?
 OuterClassという名前の普通のクラス

2.2.1.3 ロックの獲得と解放

2.2.1.4 スタティック

◇P.88 下から2行目 スーパークラスの中で
 スーパークラスも別なクラスとして考えられるから。

◇P.89 getClassでロックをしてはいけない場合とは?
 継承しているとgetClassでは異なるクラスをとってきてしまう?
 サブクラスを取ってくる可能性はある。
 クラスローダが変ってしまう、もしくはクラスが再ロードされるとクラス名が同じ
でも違うクラスになるから?

◇P.89 サブクラスからスーパークラスのフィールドはどのように扱われるのか?
 実際に試してみよう。宿題3

2.2.2 完全な同期オブジェクト


以上です。


[ 戻る ]