読書会(Javaスレッドプログラミング)第6回議事録
[ 戻る ]
「Javaスレッドプログラミングを読む会」第6回
佐藤@iplです。
今回は、進んだページ数は普段より若干少ない(30ページ)ものの、スレッドプ
ログラミングでは使用頻度の高い"wait"や"notify"、"notifyAll"などの利用
方法を勉強できました。
そして、最後には「JAVA PRESS vol.15」をいただきました。:-)
それでは、4/21(土)の議事録です。なにかありましたら指摘してください。
「Javaスレッドプログラミングを読む会」第6回
日時: 2001/4/21(土) 10:00 - 17:00
場所: 新宿勤労会館 第二洋室
参加者(敬称略): 高橋(徹)、高橋(智)、秋元、佐藤、武川(午後から)、布留川(午
後
から)、石黒(夜の部)
朗読者: 高橋(智)
書記: 佐藤
P.200
3.1.2.4 リソースの管理
Threadに対するセキュリティ
→SecurityManagerによって管理する。
ファイルアクセスにはすでにセキュリティが含まれている。
Policyに書くことによってPriorityを変更できる。
3.1.2.5 マルチフェーズキャンセル
P.202
1.1.2節を参照
→1.1.2.2(P.16)のスレッドが開始して、〜
このメソッド
→terminateメソッド
trueをリターンする可能性
→isAliveメソッドがfalseになることもある。
3.2 保護されたメソッド
3.2.1 保護された一時停止
タイムアウト
→HTTPのGETコマンドでタイムアウトになるようなイメージ
保護だといつまでも待ち続ける恐れがあるので、タイムアウトを使った方が良い。
ただし適切な値を決めるのが難しい。
そのため、設定ファイルを使うようにすると変更にも強い。
3.2.1.2 状態に基づいたメッセージの受け付け
Ada
→エイダと読みます。PascalやAlgolをベースとした言語。
ここの疑似コードでは条件判定をしてからメソッドを実行する。
メソッドにつけるsynchronizedのようなイメージ
実行上はP.205(3.2.1.1)の疑似コードと同じであろう。どちらも待ち続ける。
Java1.4ではこうした構文が採用されたりするのだろうか?
条件式が長くなってソースが見づらくなったら嫌だなぁ。
P.208
オートマタ(automata)
→「オートマトン(automaton)」の複数形(秋元さんのメールより)
述語命題表現
→boolean表現のこと?
3.2.2 モニターメカニズム
synchronizedなし(ロックしない状態)で、wait、notify及びnotifyAllの各メ
ソッドを呼ぶとIllegalMonitorStateExceptionの例外が発生する。
Interruptメソッド
→スレッドプールを用いるときに使うだろう。Servletエンジン(Tomcat)のソ
ースでgrepすれば見つかるのではないか?
Javaの鉄則(ピアソン・エデュケーション)
→スレッドに関しての記述が多くある。
□ 昼休みの話題
・JUnitの有用性
・Javaを中心にしたツール(JBuilder,Kylix,Baykitなど)
・EJBのこれから
・外資系会社の仕事
・稚内北星学園大学の活動内容
3.2.3 保護された特徴
P.214
チェック処理の間に〜
=チェック処理をしているときに状態を変更してしまうと読み取るタイミン
グによってその値が最新でない場合がある。
3.2.4 通知
最初のパス
→一番目のバージョンの意
SimpleBoundedCounterクラスのsetCount内のnotifyAllはincやdecメソッドの
実行後に処理される。
→P.216の"同期メソッドの中では、〜"。P.212の図が参考になる。
3.2.4.1 条件の取り逃がしとシグナルの見過ごし
使うべからずの例は、ロックはできるだけ短くするという原則の反例である。
3.2.4.2 単一の通知
コンテクストスイッチ
→(今実行している)スレッドの切り替え器
P.219〜P.220の不完全なコードでのスレッドを2個から3個にしたとき問題
は起こらないのか?
→待機セットはオブジェクトごとに持つため問題はない。
3.2.5 期限付き待機
TimeoutBoundedCounterクラスではnotifyAllを使っているので、ループ(for(;;))
を抜けるためにタイムアウト時間(waitTime)を減らしていく必要がある。
3.2.6 ビジーウェイト
3.2.6.1 効率
"アダブティブな"ロックとはなに?
3.2.6.2 スケジューリング
3.1.1.5節で説明した期限付きのバックオフテクニック
→P.189の"この場合には、〜"
3.2.6.5 実装
SpinLockクラスのreleaseメソッドにはなぜsynchronizedを付ける必要がある
のだろうか(busyはvolatileのboolean型なのに)?
→synchronizedによって実行順序が保証されるから?一つのスレッド内であ
れば意味的におかしくなることはないが複数のときはおかしくなることがあ
るかもしれない?
→volativeがJVMで正しく実装されていないかもしれないことまでを考慮して
いるから?
この件に関しては、武川さんが訳者の松野さんに質問中です。
3.3 クラスの構造化とリファクタリング
3.3.1.1 チャネルと上限付きバッファー
チャネル
→データのやり取りをする概念
効率の向上
→空と満杯のときだけnotifyAllする。
if文の条件式に'++'や'--'があるのは嫌だなぁ。
'== 0'には、リファクタリングならisEmpty()とかを用意するだろう。
→そうすればコメントは必要なくなる。
P.228のBoundedBufferWithStateTrackingクラスはP.227のBoundedBufferイン
ターフェイスをimplementsしなければいけないはず。
3.3.1.2 状態変数
BoundedCounterWithStateVariableクラスを変更するとしたら
→incやdecメソッドで状態変数を設定してupdateStateメソッドの引数に渡す。
リファクタリングならStateパターンを使うだろう!?この例では大げさすぎるか。
□ その他の話題
・バイトコードの制限でローカル変数の数が限定される。
・テンプレートをもとにJSPページをServletで作るといった方法がある。
・Apache2.0はこれまでサポートされていなかったプラットフォームの幾つか
でマルチスレッドをサポートするようになる。
→Linuxではスレッドをプロセスとして管理している(psコマンドで確認可)。
以上 P.230 3.3.2 競合セットの前まで読み終わりました。
[ 戻る ]