2009-07-21 10 views
3

Lock(java.util.concurrent.locks.Lock)の組み込みロックに対する利点の1つは、Lockが「チェーン・ロック」を容易にするということです。チェーンロックは、Aのロックを保持し、BリリースAを取得した後にBを取得してからCを取得します。ロックによるチェーン・ロック

私はちょうど興味がありますか、チェーンロックの使用が必要な状況に遭遇しましたか? ?

乾杯、 ヴィック

答えて

3

あなたは、相互に独立しているクリティカルセクションのシリーズを持っていますが、あなたが適切であるために、実行したい任意の状況。

これはブリトーバーのように思えます。あなたには消費者の列があり、反対側には4人ほどの労働者がいます。消費者が他の消費者より先に飛び越すことを望んでおらず、一度に複数の消費者にサービスを提供することも望ましくありません。各サーバー間でキューを作成することもできますが、パイプラインは厳密にシーケンシャルであることがわかります。抽象化はコードでは最適な表現ではないことがあります。

ただし、パイプラインのステージの1つを取得できるようにするために、例外的な処理を行う場合があります。たとえば、最後にキャッシャー。誰かがギフトカードを受け取った場合、キューをスキップして出納係に直接行くことができます。このモデルは、平均待機時間/待ち時間を削減しながら、他の作業者に必要なロックと順序保証を提供します。

同様に、同じ効果を達成する方法はたくさんありますが、ドメインモデルと実装モデルの間の認知距離はコードの明瞭性に影響します。したがって、シーケンスで次のリソースを取得する前に1つのリソースを解放しないようにするアプリケーションがある場合は、ロック・チェーンが便利なソリューションです。

最後に、javaの同期機能が厳密にネストされていることを忘れないでください。ロックを取得した順序でしかリリースできません。長く複雑なパイプラインがある場合は理想的ではありません。

+0

IMO、あなたが言ったようにパイプラインが連続しているなら、それはQueues/Pipeを通して実装するのが最善です。ワーカー - キュー - ワーカー - キュー - ワーカー - キュー - キャッシャ。キュージャンパーが入ってくると、彼はジャンプするキューに入るだけです。各作業者は入力キューからポップし、出力キューにプッシュします。 –

関連する問題