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

[jfriends-ml 1534] Java スレッドプロ グラミングを読む会第 4 回議事録



こんにちは、Java スレッドプログラミングを読む会第 4 回
で書記を担当した武川です。議事録を送ります。

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

□ 日時 : 2000/2/24 (土) 10:00から17:00まで

□ 場所: 新宿勤労会館 第二洋室

□ 参加者(敬称略): 高橋(徹)、高橋(智)、亀田、布留川、武川、秋元、石黒

□ 当日のスケジュール
   1. 自己紹介
   2. 書記の選出(武川)
   3. 読書(読み手 高橋(智)さん)
   4. 2次会

P123 2.3.3 オブジェクトの限定

限定についてはP114を参照してください。

引渡しポイントとはなにか?
→P.127のCollections.synchronizedList

アグリゲーションの主要な意味を実装している?

→UMLの記法で「◆と◇」で意味が違ったとおもう。
 ◆の方はたしかに固定格納と同様の意味だったはず。

2.3.3.1 アダプタ

クラスBarePointはdouble型のフィールドなので、同期しない場合は
不正なdoubleの値になる可能性がある。

ホストがSynchedPointクラスで、部品がBarePointクラスになる。

ArrayList()が同期していたとしても、Iteratorをとってきた場合に
問題が発生しなかったか?
→そういう場合が考えられるときには、2.4.4節のコピーオンライトな機構を
 作ればよいのではないか?

2.3.4 グループの限定

任意の重い公式の機構の例とはなにか?
→知的所有権や著作権とかの実世界の機構のはなしで、
 リソースに関するはなしはないのではない。

"提供"のy#action()の実装は、なんでこんなに面倒なのか?
x.put(ref);
ref = null;
だけじゃだめなのか?
→上記の方法だとリソースが同時にxとyに存在する可能性があるため駄目。

2.3.4.1 リング

実際どんなときにこのような仕組を使うのだろうか?
→複数のクライアントがあるサービスを共有して使用する場合とかが
 考えられるが、たしかにあんまり書く場面はないかもしれない。

P.133 PrintService#startUpServicesの predは何の略語?

2.4 クラスの構造とリファクタリング

リファクタリングとはなにか?

→システムの外部インターフェースを変えずに実装を向上させる技術。
メンテナンス性、再利用性を向上させることが目的。

→リファクタリングツールとしてinteliJというものがある。
http://www.intellij.com/products/renamer/

2.4.1 同期処理の削減

ごまかしの処理とはなにか?
→意図しない処理ということではないか。

「古さが受けいれがたいもの」の古さというのはどういう意味?
→ レジスタ上の値が変更されたが、メモリ上の値が更新されて
 ないような場合ではないか?

longとdoubleについてはマルチスレッドのアクセスがある場合はvolatileにすべき。

もし危険を求めるならば...という表現は面白い。

アグリゲートってなに?
→限定をつかったクラス群のことではないか。

しかし、もしアグリゲーションや.....の文の意味がよくわからない。
 →いまひとつ話についてけませんでした。

2.4.1.3 オープンコール

Pa141 LinkedCell のソースでvalue()がsynchronizedメソッドだが、
sum()で何度もvalue()をよんでいるのは効率悪くないか?
いっそのことsum()をsynchronizedしたほうがよいのではないか?
→nextがfinalであるという前提があるため、synchronized
 を行なう場所がvalueを アクセスする部分に限定できるというのが主旨。
 これによりロックが連鎖しない。 これに対してsumをsynchronizedすると、
 全てのLinkedCell要素をロックしてしないと、sumメソッドが実行できない。

2.4.2 同期処理の分離

2.4.2.1 

P144 の図中の矢印の上のhelperの意味は?
→helperというロールもしくは関係があるという意味ではないか。

PassThroughShapeで何がよくなったのか?
 →adjustLocation()と adjustDimensions()が同時に実行できるようになった。

ならば、LocationとDimensionを最初から別のクラスにすべきではないか?
 Shapeという単位でアクセスしたい。図形なので位置とサイズは別々より、
 一つのオブジェクトとして存在したほうが使いやすい。

2.4.2.2 ロックの分割

パススルー版とロック分割版のShapeクラスのどっちが好みか?
→1つのクラスにまとまっているからロック分割版。
→機能がわかれているからパススルー版。

二つのロックが共に必要になった場合はどうする?
→ロック分割版は、二つのロックを使用するように変更する。
→パススルー版

2.4.2.3 フィールドの分離

フィールドを単純にvolatileと宣言するのはなぜ不十分なのか?
→以前の値を返すsetメソッドなどがある場合(P148のソース)は、volatileでは
 排他制御ができない。

2.4.2.4 リンクされたデータ構造

LinkedQueueのputとpollの中でそれぞれlastとheadをsynchronizedしているのはなぜ?
→要素数が0か1の場合lastとheadが同じになるところがミソ。

2.4.3 読み込みのみのアダプタ 
 
Java3Dは結構速いらしい。下手にJava2Dを使うくらいだったら、
3Dで書いたほうがよい場合もある。

2.4.4 

2.4.4.1 内部的なコピーオンライト

P158のソース中 IndexOutOfBoundsException を NoSuchElementException に変換
しているが、コールスタック表示が途中で切れてしまうのでは?
→この場合は、すぐ前でエラーがおこっているのがわかるが、
 例外を変換する場合は、前の例外をフィールドに持ってコールスタック
 表示時にどこで例外が発生したかわかるようにすべき。

2.4.4.2 楽天的な更新


ライブロックとはなにか?
→複数のスレッドがある処理を失敗して、再実行するということを
 繰り返す場合のこと。

2.4.4.3 原始的なコミット

CompareAndSwap命令とはなにか?
→TestandSet命令と似たようなもの?

指数的なバックオフスキームとはなにか?
→失敗するごとに、再実行するまでの期間を指数的に増やす方法

スピンするって普通に使われる?
→まわすが普通じゃないのか?

moveToがcommitを持たないのはなぜ?
→moveToは以前の値に依存しないため、commitする必要がない。ただし、
 synchronizedなメソッドである必要がある。
 shiftXは以前の値に依存するのでcommitする必要がある。ただし、
 synchronizedなメソッドである必要はない。

2.4.5 オープンコンテナ

内部ロック、外部ロックとは?
→内部のロックは部品のロックで、外部のロックはホストのロック

2.4.5.1 内部規則

「しかし3.3.4節を参照。」ってよく意味がわからない。

部品のロック 

2.4.5.2 外部規則

aPrt.getLock()のサンプルコードはないのか?

2.4.5.3 マルチレベルの制約

2.4.6 参考文献

以上です。

その他の話題としては、以下のようなものがありました。

Dynamic Proxy
JDK1.3の新機能
JDKドキュメントのdocs\ja\guide\reflection\proxy.html

AspectJ
アスペクト指向のツール
 テスト用に一時的なメソッドを追加するのに使えるみたい。

http://www.ogis-ri.co.jp/otc/hiroba/Report/oopsla/oopsla.html
http://semicom2.u-shizuoka-ken.ac.jp:8080/~dayz/ddr/AspectJ.html
なんかが参考になりそうです。

JUnit
 テスト環境。日本語の資料が少ない。以下のページは結構役にたつ。
 http://www.alles.or.jp/~torutk/oojava/maneuver/2000/6-3.html

Ant
 マルチプラットフォームな環境でのmake環境を構築するには便利。

□次回の予定

3/20 午前10:00 より 新宿勤労会館 第二洋室 の予定です。

□感想

感想としては、今回も非常に勉強になりました。ここの
議事録には書いてないことでも(書けないor書くの忘れた)
ためになる話がいろいろ聞けておもしろかったです。
それにしてもスレッドは奥が深いです。
高橋(徹)さんもいってましたが
「知れば知るほど、プログラングが出来なくなる」
というかんじです。
#でも書くんですけど。

この本とはあまり関係ないかもしれませんが、
JUnit、Ant、AspectJについては、仕事に役立ちそうなので、
次回までに少し勉強しようと思います。
#余裕があればDynamic Proxyも。。。

あと、事前に本を読まれないという人が結構いて、それでも非常に
理解されているようなので、事前に1,2回読んで、さらに本番でも
読んで、それでも結構難しいと思っている自分にとっては、
ちょっとショックでした。でも、多分、前もって一回読まないと
ついていけないので、やっぱり僕は読み続けると思います。

以上、よろしくおねがいします。

-------------
武川 努
takekawa@xxxxxxxxxxxxxx