ReentrantLockの
一の実施中ReentrantLockのAQSは排他モードです。内部には、クラスがSYN AQSクラスを継承定義します。このクラスは、2つのサブクラスがあります。クラスは、達成するサブクラスにテンプレートメソッドシンロック()メソッドを定義します。一つの公平なロックを達成するためのサブクラス、およびその他のは不公平なロックを達成することです。
非実現公正ロック
それが0であればCAS操作がゼロでない状態変数を決定するために非常に簡単で不公平なロックを達成、その後、状態が1に設定され、ロックを取得するためにロックを保持しているスレッドが現在のスレッドに変更されます。それが0でない場合、呼び出しは、ロックをつかむために()メソッドをAQUIREします。コードは以下の通りであります:
1 / **
2 *は、ロックを実行します。通常のバックアップを、即時はしけを試してみてください
3 失敗した場合に獲得*。
4 * /
5 最終 ボイドロック(){
6 場合(compareAndSetState(0,1 ))
7 setExclusiveOwnerThread(にThread.currentThread())。
8 ほか
9 取得(1 )。
10 }
取得()メソッドは、シンクラスは、このメソッドを実装するようAQSは、サブクラスを達成するためのテンプレートを定義しながら、tryAcquire()メソッドを呼び出す必要があるため。次のようにむしろ公正ロックシンのtryAcquire()よりも実際には、シンnonfairTryAcquire()メソッドを呼び出します。
1 保護された 最終的な ブール tryAcquire(INT 取得){
2 リターンnonfairTryAcquire(取得)。
3 }
4 最終 ブール nonfairTryAcquire(INT 取得){
5 最終スレッド電流= にThread.currentThread()。
6 INT C = getStateを()。
7 場合(C == 0 ){
8 であれば(compareAndSetState(0 、取得)){
9 setExclusiveOwnerThread(現在)
10 リターン 真;
11 }
12 }
13 //はリエントラント理由である
14 他 IF(現在== getExclusiveOwnerThread()){
15 //は、スレッドがロックを獲得し続けているため、現在のスレッドは、ロックを保持していないスレッドであるか否かを判断します、その後、直接の状態に変数の値がインクリメントされます。
16 INT NEXTC = C + 取得し、
17 IF(NEXTC <0)// オーバーフロー
18は スロー 新しい新しいエラー( "COUNTが最大ロック数を超え" );
19 SETSTATE(NEXTC)
20が 戻り trueに、
21である }
22れる //falseに戻すには、no競争
23ではありません 返す falseに;
24 }
フェアロック
非実現フェアロックに比べ公平ロックは、比較的ロック公正な方法をロック、少し複雑なロックがつかむことが公平ではないので、直接取得()メソッドです。
1 静的 最終 クラス FairSync 延び同期{
2 プライベート 静的 最終 ロングのserialVersionUID = -3000897897090466540L ;
3 // ターンコールにおける方法ロック、ダイレクトコール取得()メソッドは、その実装()メソッドをtryAcquire
。4 ファイナル ボイドロック(){
5 獲得(1。);
6 }
。7
。8 / **
9は、 。*ない限りtryAcquireザ・へドゥないアクセス権限の付与の公正バージョン
10 。*電話または再帰このウェイターやNOまずありません
。11 * /
12がされて 保護されました 最終的な ブール tryAcquireに(INT 取得){
13は 、最終的なスレッド電流= にThread.currentThread();
14 INT C = getStateを();
15 IF(C == 0 ){
16 // ここでは、現在のスレッドの同期待ち行列を決定する必要はありません最初のチーム
17。 IF(hasQueuedPredecessors()&&!
18は compareAndSetState(0 、取得)){
19。 setExclusiveOwnerThread(現在の);
20である 返す trueに、
21である }
22れる }
23れる //ここでロジックが同じでかつ公正なロック、判定された現在のスレッドではない既にロックスレッドを取得していない、状態変数値がインクリメントされる
24の 他 IF(現在== getExclusiveOwnerThread()){
25 INT NEXTC = C + 取得し、
26は、 IF(NEXTC <0 )
27 投 新しい新規( "COUNT最大のロック数を超え"エラー;)
28 SETSTATE(NEXTC);
29 リターン trueに;
30 }
31は、 戻り falseに;
32 }
33れます }
hasQueuedPredecessorsを見てみましょう()メソッド
1 公共 最終 ブーリアンhasQueuedPredecessors(){
2 // これの正当は、ヘッドが初期化されるに依存
3 // 電流が尾前に正確であるhead.nextに
4 // スレッドがキューに最初にあります。
5 ノードT =尾; // 逆初期化順序で読み出しフィールド
6 ノードH = ヘッド。
7 ノードs。
8 リターン H = T &&!
9 ((S = h.next)== NULL || s.thread =!にThread.currentThread())。
10 }
明らかに、私たちが見ることができ、現在のスレッドを決定するために、キューノードの頭がキューを同期化されていないされ、決定するために、現在のスレッドよりも長いを待つスレッドではありません。公平性を達成するために。
概要
ReentrantLockの違いに関して同期:
1)ReentrantLockのは、公正かつ不公平ロックロックを達成することができます。
2)ReentrantLockの中断
3)ReentrantLockのは、ロックが解除され、手動でロックする必要があります
4)ReentrantLockのは、JDK APIレベルであり、JVMレベルを同期さ