同時高度な知識:ロック、条件、ReadWriteLockインタフェース

ロックはじめに

主なターゲットは、主な機能はsychronizeキーワードの拡張があるされているロック:

  1. sychronizeブロックロック状態にモニターを直接取得、または返すようになくなる時間を待ちます。tryLockロックが結果を返すことができ、非ブロックタスクが必要
  2. 複数のロックを取得する処理は、順序を取得し、逆の順番を離します。オブジェクトは、より柔軟なアプリケーションを必要としないロック。
  3. ロックは、たとえばReadWriteLockのために、多くの時間を得ることができます。

ロックインタフェース機能の紹介

  1. 空ロック()ロックが無効である場合にロックを取得するために、その後、待機状態に入り、それが中断することはできません
  2. lockInterruptibly()が例外:InterruptedException割り込みロックをスロー無効。待機状態に入った後に中断することができます
  3. ブールのtryLock()はロックを取得しようとします。無効なダイレクトリターン
  4. ブールのtryLock(長い時間、TimeUnit unit)指定無効待機一定時間場合は、ロックを取得するInterruptedExceptionある試みをスローします。
  5. 空ロック解除()ロックを解除
  6. 条件newCondition()オブジェクトに関連付けられているロックの状態を返します。

条件インターフェース

条件言い訳オブジェクトは、()、通知()、のnotifyAll()オブジェクト待機を達成することです。主な違いは、サブクラスが対応する機能を実装し、リッチであることができるということです。相関関数

  1. 空のawait()は、条件セットに入るのを待って、InterruptedExceptionあるコールウェイティングをスローします。
  2. 条件セットに入るのを待って、awaitUninterruptibly()コールウェイティングを無効、それが中断することはできません。
  3. 長いawaitNanos(ロングnanosTimeout)は時間が割り込みをトリガする過去の時間があるときに条件セットに入るのを待って、InterruptedExceptionあるコールウェイティングをスローします。
  4. ブール(長い時間、TimeUnitでユニット)InterruptedExceptionある功能をスロー待つ同上
  5. ブールawaitUntil(日締め切りは)に類似InterruptedExceptionある機能をスローします
  6. 無効信号()ロック状態に入るのを待って、待っている後継者の条件を選択します
  7. signalAll()と待機状態の全てを失います。ロックを取得するには、関連する機能の実装前に、待つように、その条件に注意してください。条件を取得するオブジェクトをロック、ロック、モニタオブジェクト自体を取得するのを待ちます

使用例:

 boolean aMethod(long timeout, TimeUnit unit) {
   long nanos = unit.toNanos(timeout);
   lock.lock();
   try {
     while (!conditionBeingWaitedFor()) {
       if (nanos <= 0L)
         return false;
       nanos = theCondition.awaitNanos(nanos);
     }
     // ...
   } finally {
     lock.unlock();
   }
 }
复制代码

ReadWriteLockインタフェース

これは、書き込み処理数回は、大幅に効率を向上させることができる場合に、複数のプロセスが読み取ることができるように、ミューテックスに基づいて拡張されたロック機能です。設計上の問題、優先順位、および戦略識字問題は、プロセスを読み書き。

  1. ロックreadLock()
  2. ロック書き込みロック()

ReentrantLockのロック子类

ロックインタフェースを実現するには、プロセスが制限されたロックを持ってもらうために、長い時間を待って、プロセスをブロックすることが公正なアルゴリズムを達成することができます。フェアアルゴリズムは、パフォーマンスの低下にプログラムを引き起こし、そしてもちろん飢餓と待ち時間が少なく、影響を受けました。推奨デフォルトの非公正ロック。


使い方

   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
复制代码

関連機能:

  1. 公共ReentrantLockの()デフォルト以外fairlock
  2. 公共ReentrantLockの(ブールフェア)オンデマンドの選択のロックの種類
  3. あなたがロックを取得できない場合は、その後の待機に入る、ロックを取得するために、公共ボイドロック()
  4. ます。public void lockInterruptibly()は、あなたがして、待機を中断することができ入る、ロックを取得できない場合InterruptedExceptionあるが、ロックを取得スロー
  5. パブリックブールのtryLock()は、ロックを取得真のロックを取得しようとすると、偽のロックが取得されていません
  6. パブリックブールのtryLock(長いタイムアウト、TimeUnit unit)指定InterruptedExceptionあるが、与えられた時間内にロックを取得スロー。
  7. 公共ボイドロック解除()がロックを解除します
  8. 条件オブジェクトを作成するために、公開条件newCondition()。ロックconditonとロックが自動的に解除待ちすると、条件がアクティブに待機しているFIFOの形で、それは活性化後再取得ロックする必要があります
  9. 公共INT getHoldCount()はロック解除機能の番号ロックを取得する処理を戻します。この値は、再ロックすることなく、ロック前に取得することができます
  10. 現在のプロセスがされている場合は、パブリックブールisHeldByCurrentThread()
  11. ロックされたパブリックブールisLocked()是否
  12. 公共の最終ブールisFair()公正かどうか
  13. 保護されたスレッドgetOwnerメソッド()の戻りグッズロック所有者
  14. 公共の最終ブールhasQueuedThreads()保護されたコレクションgetQueuedThreads();公共の最終int型getQueueLength()待機するかどうか、スレッドの数を待って、待っているスレッドのセット。値は必ずしも正確ではないことに注意してください。
  15. パブリックブールhasWaiters(条件条件);公共のint getWaitQueueLength(条件条件);保護されたコレクションgetWaitingThreads(条件条件)同上只是针对条件的
  16. 公共の文字列のtoString()

ReentrantReadWriteLock类

それはreaderwriterlockインタフェースを実装します

  1. シーケンスが得られる:、障害、デフォルト、高効率を。B、低パフォーマンスを処理するのに長い時間を待って、公正、優先呼。
  2. 私は、ロックを再取得することができます。その逆はない、ロックが読み取りロックを取得することができます書きます
  3. パフォーマンスの低下ロック:書き込みロックではなく、その逆、読み取りロックに変換することができます。上記のような意味
  4. 書き込みロックを中断することができます
  5. 条件のサポート、書きます。何の条件をロックしていない読みます
  6. 取扱説明書、一部の命令のみ適切なモニタリング。情報通信遮断のないプロセス、。同じでEntrantlock相関関数、説明していません

引用文

チュートリアル

公式の説明ライブラリー

おすすめ

転載: juejin.im/post/5d0f4d9bf265da1b91639ded