ReentrantLockは、同期クラスインスタンスによって内部的に実装されます。
同期クラスは、ReentrantLock内で定義されています。
Syncは、abstractqueuedsynchronizerから継承します。
Abstractueuedsynchronizerは、Abstractownablesynchronizerから継承します。
現在所有されているスレッドを表す、AbstractOwnablesYnchronizerクラスでは、排他的所有者変数のみが定義されています。
同期クラスに加えて、ReentrantLockは2つの実装クラスも内部で定義します。
NonFairSyncは不公平なロックです。 Fairsyncは公正なロックです。
ReentrantLockの2つの構成要素は次のとおりです。
ReentrantLockロックメソッド
不公平なロックメソッド
CompareAndsetStateメソッドはCASメソッドです。このメソッドは、オブジェクト内の変数を更新しようとします。変数は0になると予想し、1に更新されます。
更新が成功した場合は、排他的なOwnThread変数を現在のスレッドに設定します。その後、ロックメソッドはすぐに戻ります。
更新が失敗した場合、取得(1)が呼び出されます。
coveireメソッドでは、tryacquire()が最初に呼び出され、再度更新してみます。
不公平なロックのtryacquire()方法は次のとおりです。
不公平なロックの非フェアトリックア()メソッドは、次のように以外の非フェアトリックイアメソッドによって内部的に呼ばれます。
TryAcquire()メソッドが成功せずに再試行された場合。まず、AddWaiter()メソッドが呼び出され、現在のスレッドを待機キューに追加します。 AddWaiterメソッドはノードノードを返します。
ノードに戻った後、actirequeued(ノード、1)は再度更新しようとします。
更新を更新できない場合、スレッドはParkandCheckinterruptを介して吊り下げられます。
ReentrantLockロック解除メソッド
リリース()メソッドをご覧ください。
キューのヘッドが空でなく、頭の待機状態が0でない場合、Unparksuccesser()メソッドが呼び出されます。
Unparksuccesser()メソッドは次のとおりです。
ノードの次のトラバースを背面から前面に移動して、0未満のWaitStatusでキュー内の最初のスレッドを取得します。次に、ノードのスレッドを続行します。