「増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編」第三章『Guarded Suspension』読書中

時間がなかなかとれないものの,日々少しずつでも進めている.

現在読んでいる章は『Guarded Suspension』というサブタイトルが付けられている.

Guarded Suspension パターンは,スレッドを待たせてインスタンスの安全性を守ります.それはちょうど,配達員を玄関先で待たせて自分のプライバシーを守るのと似ています.

とあるように,あるスレッドが実行されている際には他のスレッドを待たせておき,スレッドの実行が終了してから待っているスレッドの実行にとりかかるというものである.

サンプルプログラムでは,リクエストを行うクライアントスレッドとそのリクエストを処理するサーバースレッドを実装する.両者ともに,リクエストを格納するキューを使用する.クライアントはリクエストをキューに追加し,サーバーは追加した順番通りにキューからリクエストを引き出し処理を行う.ちなみに UML ではこのようなサーバー・クライアントスレッドのことを能動オブジェクト (active object),キューのことを受動オブジェクト (passive object) と呼ぶらしい.

当然キューにリクエストがなければ処理は実行できない.キューにリクエストが存在するということがガード条件になっている.このように,ガード条件が満たされるまでスレッドは処理を待たされるわけである.具体的な処理としては,キューにリクエストがない場合は,サーバースレッドは while 文とwait() によって処理の実行を待ち,クライアントスレッドがリクエストを追加し,notify/notifyAll でそれを知った上で処理の実行を開始する.