Loading article…
並行プログラミング において、ガードサスペンション[1]は、操作を実行する前にロックの取得と前提条件の両方を満たす必要がある操作を管理するためのソフトウェア設計パターンです。ガードサスペンションパターンは、通常、オブジェクト指向プログラムのメソッド呼び出しに適用され、前提条件(ガードとして機能する)が満たされるまで、メソッド呼び出しと呼び出しスレッドを一時停止します。
使用法
ガードされた中断パターンはブロッキングであるため、通常は、メソッド呼び出しが有限かつ妥当な期間中断されることを開発者が知っている場合にのみ使用されます。メソッド呼び出しが長時間中断されると、プログラム全体が遅くなったり停止したりして、前提条件が満たされるのを待ちます。メソッド呼び出しの中断が無期限または許容できないほど長い期間になることを開発者が知っている場合は、バルキング パターンが適している可能性があります。
実装
Java では、Object クラスはガードされた中断を支援するメソッドwait()とnotify()メソッドを提供します。Kuchana (2004) で最初に発見された以下の実装では、メソッド呼び出しが成功するための前提条件が満たされていない場合、メソッドは最終的に有効な状態になるまで待機します。
public class Example { synchronized void guardedMethod () { while ( ! preCondition ()) { try { // 待機を継続 wait ( ); // … } catch ( InterruptedException e ) { // … } } // 実際のタスク実装} synchronized void alterObjectStateMethod () { // オブジェクトの状態を変更// … // 待機中のスレッドに通知 notification (); } }
実際の実装例としては、getキューにアイテムがないときにそれを検出するガードを持つメソッドを持つキュー オブジェクトが挙げられます。putメソッドが他のメソッド (たとえば、getメソッド) に通知すると、メソッドgetはガード状態を終了して呼び出しを続行できます。キューが空になると、メソッドgetは再びガード状態になります。
参照
- バルキングパターンは、前提条件に対処するための代替パターンである。
- ガードコマンド言語には同様の言語構造が含まれている
- リーダー・ライターロック
注記
参考文献
- Kuchana, Partha (2004)。「Java のソフトウェア アーキテクチャ設計パターン」(ドキュメント)。フロリダ州ボカラトン: Auerbach Publications。。
