プロデューサーのロックロック - 消費者モデル

ロックの説明をロック:

あなたは、より柔軟な利用シナリオ、効率的なパフォーマンスを得るためには、Javaはまた、ロックインターフェースとその実装クラスReentrantLockのと読み書きロックReentrantReadWriteLockを提供しています、次のマルチスレッド同期オブジェクトにアクセスするためにJavaで同期することができます。

 同期を達成するために、同期と比べ、ロック同期を使用する次のような違いがあります:

 1、 synchronizedキーワードの使用、およびロック制御開始位置と終了位置を解放は、同期コードブロックに同期されます。同期ロックを使用する場合は、ロックは、異なるコードブロックに異なるアプローチを取得し、解放することができます。これは、手動でロックを取得および解放するためにユーザの特性に基づいています。

 2は、ロックインタフェースはのtryLockを呼び出すときのtryLock()メソッドがfalseを返したロックを取得しようとすると()を提供し、ロックが失敗した取得するために、このスレッドは、スレッドがスリープ状態にしないこと、他の操作を行うことができます。tryLock()メソッドは、特定の時間がロックを取得することができ、長時間のパラメータタイプを渡すことができます。

 3、ロック実装クラスReentrantReadWriteLockインタフェースは、読み取りおよび書き込みロックは、複数のスレッドが読み取りロックを得ることができますが、一つだけのスレッドが書き込みロックを取得しています。読み取りと書き込みのロックを得ることができません。luceneのは、複数のスレッドがインデックスデータのクエリを読み取ることができますが、一つだけのスレッドがあるインデックスデータを構築するための責任があるとして、同時読み取りを必要とするアプリケーションでは非常に重要であり、読み書きの分離を達成します。

 4、上記の3:00は、優れたパフォーマンスとの同期ロックを実現しています。

ロックロックや条件同期:

そして同様に、同期、ロックロック状態の同期化を図ることもできます。インタフェース条件Javaパッケージと同時実装クラスConditionObjectの提供。

一定の条件が満たされると、コール状態が待っています()メソッドは、待機するようにスリープ状態に、現在のスレッドになります。スレッドウェイクが待つため)(signalAllの条件()メソッドを呼び出してスリープ状態になります。

では条件同期と同期ボーエン、我々はプロデューサー実施して同期使用する-消費者モデル、ここでは、プロデューサーの同じ条件を達成するためのロックロックと同期を使用しようとする-消費者モデル:

 

  1. パブリック  クラスMessageStorageByLock {  
  2.     プライベート  int型maxSizeの。  
  3.     プライベートリスト<文字列>のメッセージ。  
  4.   
  5.     民間  最終ReentrantLockのロック。  
  6.     プライベート  条件条件conditionWriteの最終; // 2つのロック状態を宣言する  
  7.     民間  最終条件conditionRead。  
  8.     公共MessageStorageByLock(int型maxSizeの){  
  9.         this.maxSize = maxSizeの。  
  10.         メッセージ=  新しいLinkedListは<文字列>();  
  11.         =ロック  ReentrantLockの(の新しい新しい真の); //真の公平性がロックキューを取得するためLIFO使用して、trueに、ロックを変更  
  12.         = lock.newCondition conditionWrite(); // newCondition()メソッドを呼び出し、すなわち新しいConditionObjectの()。  
  13.         conditionRead = lock.newCondition()。  
  14.   
  15.     }  
  16.     公共  ボイド集合(文字列メッセージ){  
  17.         //、営業利益へのアクセスを同期するためにロックを使用して、ロックが別のスレッドによって使用されているとき、現在のスレッドはスリープ状態になります  
  18.         lock.lock();  
  19.         {試します  
  20.             一方、(messages.size()== maxSizeの){  
  21.                     System.out.print(「メッセージバッファは、(待機に開始)\ nは、今いっぱいです」);  
  22.                     conditionWrite.await(); 条件が満たされた場合//スレッドがスリープしてロックを解除。あなたがsignalAll()を呼び出すとき。スレッドが目を覚ますと、ロックを取り戻します  
  23.             }  
  24.             Thread.sleep(100)。  
  25.             messages.add(メッセージ)。  
  26.             System.out.print("メッセージを追加:" +メッセージは+ "成功\ nを");  
  27.             conditionRead.signalAll(); //ウェイクためconditionRead.await()休止状態のスレッド  
  28.         } キャッチ(InterruptedExceptionある電子){  
  29.             e.printStackTrace();  
  30.         } 最後に{  
  31.             施錠開錠();  
  32.         }  
  33.     }  
  34.     公共の文字列のget(){  
  35.         文字列メッセージ=  NULL;  
  36.         lock.lock();  
  37.         {試します  
  38.             一方、(messages.size()==  0){  
  39.                 conditionRead.await();  
  40.                 System.out.print(「メッセージ・バッファは、(待機に開始)\ nは、今や空です」)。  
  41.             }  
  42.             Thread.sleep(100)。  
  43.             メッセージ=((LinkedListの<文字列>)メッセージ).poll();  
  44.             System.out.print("メッセージを取得:" +メッセージは+ "成功\ nを");  
  45.             conditionWrite.signalAll();  
  46.         } キャッチ(InterruptedExceptionある電子){  
  47.             e.printStackTrace();  
  48.         } 最後に{  
  49.             施錠開錠();  
  50.         }  
  51.         メッセージを返します。  
  52.     }  
  53. }  

要約:

 

synchronizedキーワードまたはロックロックが原因複数のスレッドに混乱を避けるために、マルチスレッド環境でのリソースへのアクセスの同期を制御するために使用されているかどうかを同時に発生するデータにデータを読み書きします。違いが同期して、ロックロック同期を取得し、ユーザーが手動で制御ロックを解除する必要があるということである、その柔軟性ことにより、より複雑なマルチスレッドの同期と高い性能を実現することができるが、同時に、ユーザーがロックを取得する必要がありますロックの動作中に例外をキャッチするための時間のコードの後に​​リリースされ、最終的にブロックされます。

おすすめ

転載: www.cnblogs.com/binghuaZhang/p/11119648.html