ReentrantLockのは、それがブロックされることなく、リソースをロックリピート繰り返します(別の方法で)再入国のための暗黙の支援として、キーワードを同期化されていませんが、スレッドを作ることができ、リエントラントミューテックスです。
ReentrantLockのJavaクラス図:
静的インナーAQSを継承同期抽象クラスは、可視ReentrantLockのカスタム同期の組み合わせのロック取得および解放することによって達成されます。
ReentrantLockのコンストラクタは、ロックのパフォーマンスの公平性を制御することができます。
1つの 公共 ReentrantLockの(ブールフェア){ 2 SYNC =フェア?新しい FairSync():新しいNonfairSync(); 3 }
「飢餓」確率を減らすために公正に十分なロック、長い満たすために要求の優先度以上を待ちます。
公正かどうかは、ロック、公正、そしてロック獲得絶対年代順は空き状況に、要求に従わなければならない場合、ロックを取得するためのものです。
公正ロックへの最初のノードを取得するために、同期キューから毎回ロック、ロックではなく、状況の公正ロックを獲得するために継続的なスレッドの表示され、特に、ちょうどロック・スレッドをリリースしたのサブチャンスに同期ステータスを取得します大きな、他のスレッドは、キュー内の同期を待っているので。
システムの態様を切り替えるスレッドコンテキストに、非公平ロックスイッチの数は、より大きなスループットを確保するため、オーバーヘッドスイッチング相対的に大きく公平ロックのロックの公平性が、少しスレッドスイッチよりも著しく少ないであろう。
クラスコードReentrantLockのの基本的な構造:
1 パブリック クラス ReentrantLockのの実装がロックしたjava.io.Serializable { 2 プライベート 最終同期同期; 3 。4 // 引数なしのデフォルトのコンストラクタ、デフォルト非フェアロック 5。 公共ReentrantLockのの(){ 6。 SYNC = 新しい新しいNonfairSync(); 7 } 8 。9 // 引数なしコンストラクタ、決定は、公正または不当ロックラッチで 10 公衆 ReentrantLockの(のブールフェア){ 11。 SYNC =公正?新しい新しい:FairSync()新しい新規; NonfairSync() 12である } 13であります 14の // 抽象基底クラスはAQS、公正公平ロックおよび非ロック継承クラス、それぞれ、およびそれらのロック()メソッドを達成継承 15 抽象 静的 クラス Syncを延びAbstractQueuedSynchronizerを{ 16 抽象 ボイドロック(); 17 // 省略.. 18 } 19 20 // ロック不当達成 21である 静的 最終 クラス NonfairSync 延び同期{...} 22が 23である // の公正ロック 24の 静的 最終 クラス FairSync 延び同期{...} 25 26である //特定の実装に依存するためのロックは、サブクラスを呼び出し 27 公的 ボイドロック(){ 28 sync.lockを(); 29 } 30 31である // ロック獲得応答を中断する 32 公共 ボイドを lockInterruptibly()でスローInterruptedExceptionあるが{ 33は sync.acquireInterruptibly(1。 ); 34 } 35 36 // ロックを取得しようとする試み、達成するためのロックデフォルト非公正な方法 37 [ パブリック ブールのtryLockを(){ 38で 返す sync.nonfairTryAcquireを(1 ); 39 } 40 41である // タイムアウト取得ロック 42である パブリック ブールのtryLock(ロングタイムアウト、TimeUnitでユニット) 43れる スローInterruptedExceptionある{ 44が 戻り sync.tryAcquireNanosを(1 、unit.toNanos(タイムアウト)); 45 } 46れる 47 // リリースロック 48 公共 ボイドUNLOCK(){ 49 sync.release (1 ); 50 } 51は、 52である // (キューを作成するために、Condetionから理解される)ロック状態を作り出す 53は 公衆条件条件newCondition(){ため さ54 戻りsync.newConditionを(); 55 } 56 57 //省略.... 58 }
方法ReentrantLockのは、ロックを解除抽象静的内部クラス同期、現在のスレッドの同期状態値を調べれる(繰り返しロック状態値が増加を取得)、リリース同期状態に同期状態の値を減少させるために、n個のロック取得する場合時間は、最初の(N-1)倍のリターンは、唯一の同期状態は、完全に(C 0)、nullに設定されているスレッドのリソースを占有する偽解除され、trueを返しています。
1 保護された 最終的な ブール tryRelease(INT リリース){ 2 INT C = getStateを() - リリース。 3 の場合(にThread.currentThread()!= getExclusiveOwnerThread()) 4 スロー 新しいは、IllegalMonitorStateException(); 5 ブール自由= 偽; 6 もし(C == 0 ){ 7 フリー= 真。 8 setExclusiveOwnerThread(NULL )。 9 } 10 SETSTATE(C); 11 戻る無料。 12 }