AQSは、JDKレベルはロックを達成しています。
主原則の実現の同期キュー、キューの条件に依存しています。
実用的なシナリオから、我々はこの原則について話すために着手しました。
1、リソースの操作をつかむしたいんA、B、Cのスレッド。
2. Aスレッドがロックオブジェクトを取得するために役立ったイベントを開催します。それはリソースを保持している間、他のスレッドは、同期キューおよびB、Cの順に添加し、ブロックされます。
3、および各チームは、信号状態ならば、自分自身をブロックし、ウェイクアップ待機し、ノードが信号状態ではありません前に、自分自身をチェックノードに回転します;ない場合、彼らはロックを取得するために[試みをスピン、それ未満を取得しようとしますそれは、信号状態]このプロセスになります。
次いで、図4に示すように、スレッドAが終了したとき、それはロックを解除し、キュー同期ヘッダノードをウェイクアップ、このときの第1のノードBは、ロックを取得するであろう。
現在のリソースキューの要素が空であり、その操作はテイク()操作を行うことになるように5は、Bがロックを取得すると、彼は操作の前に、スレッドAを発見しました。実行できない、それがブロックされていたであろう。どのようにそれを行うには?
図6は、この時間は、条件のうちキューに追加します、その後、他のスレッドのリソースへのアクセスは、アップ状態のスレッドBが出会うまでの動作を行うようにすることを、ロックを解除します。
図7に示すように、ロックを解除した後、キューウェークアップ同期ノードCの頭部、今回はCリソースを取得します。これは、キューリソースが置か()操作の実装に反しています。
図8に示すように、この時間は、ノードBを復帰されますキュー内の条件は、同期キューに尾の条件にキューから転送されます。
9、スレッドCエンドの実行()オペレーションを入れ、ロックが解除され、第1のノードBの同期キューをウェイクアップされます。
10、次にB実行テイク()オペレーションをスレッド。同時終了。
上記は、単純なロックモデルです。
ロック状態へ、int型。
タイムアウトもあります。これらのサブクラスは、独自のルールを実現しています。
同期キューとキューは、条件付き要素であり、ノード
メインこれらのパラメータのノード:
ノードの現在の状態waitStatus。1(葛)] [キューを同期-2(CONDITION)] [キュー条件、-3(PROPAGATE)共有ロック[] - 0(初期化)、1(キャンセル)は、あります
排他ロックまたは共有ロックがノードラベルされたフィールドに基づいていますされています。
nextWaiter、キューの中の条件は、ノードを指し、同期キューで、どのような属性は、ロックを指します。
現在のスレッドにバインドされたスレッド。