1.ロックインターフェイス
Lockインターフェースは、lock()、tryLock()などのいくつかのメソッドと、ReentrantLockなどのその他のメソッドを提供して、キューシンクロナイザーに基づいて
二、AbstractQueuedSynchronizer
1.キューシンクロナイザとは
キューシンクロナイザーは、スレッドノード(FIFOモデル、先入れ先出し)を含む、スレッドキュー(簡単に理解するとロック)の同期ステータスを達成する一連のメソッドを提供する抽象クラスであり、キューノード属性には次のものが含まれます:ヘッダー( head、tail、prev、およびnextノードは、ロックを取得するための一連のメソッドを提供し、これらのメソッドはすべてCASスピンを通じて書き込まれます。
2.キューシンクロナイザがリライトする必要があるメソッドとすでに提供されているメソッド
書き換えが必要なメソッドは、試行の最初のメソッドであり、同期ステータスを取得するために使用されます。提供されたメソッドは、書き換えが必要なメソッドを実行します
提供されるメソッドは次のとおりです。
同期ステータスのみを取得する
排他リリース同期状態
共有同期ステータス
共有リリース同期ステータス
クエリ同期ステータス
3.独占式
ロックを取得します。
キューノードに新しいスレッドが追加され、このノードのスピンCAS判定が設定されて、フロントノードがヘッドノードであるかどうかを判断し、同期ステータスを取得しようとします。判定が成功し、取得が成功した場合、ノードはヘッドノードとして設定され、実行されます。それ以外の場合、判定は続行されます。スピン判定
ロックを解除する
4.共有
共有と排他の違いは、複数のスレッドが同時に同期ステータスを取得できるかどうかです。
ロックの取得はロックの解放に似ており、スピンを使用して、上部フロントノードがヘッドノードであるかどうかを判断して、同期状態を取得しようとします。
5.同期ステータスを取得するための排他的なタイムアウト
指定された時間内にロックを取得することを指し、取得された場合はtrueを返し、それ以外の場合はfalseを返します。これは 同期で は使用できません。また、 同期中断します( interrupte )スレッドがブロックされていて、キュー同期は資源節約、すぐに戻って、例外をスローすることができます。
排他タイムアウト状態同期を獲得 し、 排他的な 位相比較、同じプレスピンの最初の半分は、それが偽と判定された場合、ノードは、タイムアウトとロジックリターンがあるかどうかが決定される、しかし、ヘッドノードであるか否かが判断されます。
3、再入可能ロックReentrantLock
特徴
同じスレッドの場合、lock() 操作に再入可能ロックを複数回使用しても スレッドのブロックは発生しません。これは再入可能ロックの名前です。
再入可能ロックは同じスレッドを複数回ロックできるため、ロック数のカウントがあり、カウントが解放された後にのみ、再入可能ロックが解放されたと見なされます。
さらに、再入可能ロックは、フェアロックとアンフェアロックに分けられます。フェアロックは、その名前のように、最初にロックを取得して最も長い時間待機し、次に最初にロックを取得して実行します。非公平ロック、つまり、どのスレッドが最も長く待機するかに関係なく、ロックを最初に取得した人、ロックを所有している人は、公平性を判断するロジックがありません。
不当なロック
再入可能ロックのデフォルトの実装は、不当ロックです。不当ロックは、ロックされるたびに2つのCASロックロックを試行します。両方のCASロックロックが失敗した場合、それらは同期キューに入り、待機します。
フェアロック
フェアロックは、ロックを取得しようとするたびに、先行が存在するかどうかを判断します。存在する場合、キューに入れられた後、ロックを取得しようとしません。
不当なロックと公平なロックの概要
フェアロックは、スレッド実行のFIFO先入れ先出しルールのみを保証しますが、フェアロックはフェアロックのようなリソースを占有せず、ロックを取得できるスレッドであるかどうかを判断するため、フェアロックほど効率的ではありません。オーバーヘッドがはるかに少なくなります。
4. ReadWriteLock
特徴
読み取り/書き込みロックにより、複数のスレッドが同時に読み取りロックを取得できますが、書き込みロックを取得するとブロックされます。書き込みロックを取得すると、読み取りロックを取得するためのすべての操作がブロックされます。読み取り/書き込みロックには、フェアロックとアンフェアロックの特性もあります。読み取り/書き込みロックは、キャッシュなどに適しています。キャッシュは、複数のスレッドで読み取るときに同時に読み取りロックを取得でき、書き込み操作は書き込みロックを取得する必要があります。
原理
読み取り/書き込みロックは、32ビットブレーク方式による値によってのみ読み取り/書き込みステータスを判断します。最初の16ビットは読み取りロック状態で、最後の16ビットは書き込みロック状態です。読み取りロックを取得するとき、同期状態と読み取り/書き込みステータス値を使用してビット操作&が実行され、書き込みロックを取得するときにビット演算子>>>が使用されます。
読み取りロック
複数のスレッドが同時に読み取りロックを取得でき、このときにスレッドが書き込みロックを取得しようとすると、ブロックされます。
書き込みロック
排他ロックである書き込みロックを取得できるスレッドは1つだけです。