モジュール java.base

クラスReentrantLock

java.lang.Object
java.util.concurrent.locks.ReentrantLock
すべての実装されたインタフェース:
Serializable, Lock

public class ReentrantLock extends Object implements Lock, Serializable
synchronizedメソッドおよび文を使用してアクセスする暗黙の監視ロックと同じ基本動作およびセマンティックスを使用し、かつ拡張機能を持つ、再入可能な相互排他Lockです。

ReentrantLockは、最後にロックに成功したが、まだロック解除していないスレッドによって所有されます。 ロックが別のスレッドに所有されていない場合、lockを呼び出すスレッドが復帰してロックの取得に成功します。 現在のスレッドがロックをすでに所有している場合、メソッドはただちに復帰します。 これは、isHeldByCurrentThread()メソッドとgetHoldCount()メソッドを使用してチェックできます。

このクラスのコンストラクタは、オプションの公平性パラメータを受け入れます。 trueに設定されている場合は、競合が存在すると、ロックではもっとも長く待機しているスレッドにアクセスが許可されます。 そうでない場合、このロックが特定のアクセス順を保証することはありません。 多数のスレッドによりアクセスされる公平ロックを使用するプログラムは、デフォルト設定を使用するプログラムよりも低い(より低速な、多くの場合非常に低速な)全体スループットを表示する場合がありますが、ロックを取得する際の変動はより小さくなり、枯渇しないことが保証されます。 ただし、ロックの公平性により、スレッド・スケジューリングの公平性が保証されるわけではありません。 このため、公平ロックを使用する多数のスレッドの1つが複数回連続して取得し、アクティブなほかのスレッドの進捗が見られず、ロックを保持していない状態になることもあります。 また、時間指定のないtryLock()メソッドが公平性の設定に従わないことにも注意してください。 ほかのスレッドが待機中でもロックが有効であればこのメソッドは成功します。

常に lockの呼出しの直後にtryブロックを続けることが推奨されています。通常、次のような前/後の構築で実行します。

 
 class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

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

Lockインタフェースの実装に加えて、このクラスはロックの状態を検査するためのpublicメソッドおよびprotectedメソッドをいくつか定義します。 これらのメソッドの一部は、計測と監視だけに役立ちます。

このクラスの直列化は、組込みロックと同様に動作します。直列化解除されたロックは、直列化時の状態にかかわらず、ロック解除状態になります。

このロックは、1つのスレッドで最大2147483647の再帰的ロックをサポートします。 この制限を超えようとすると、ロックしているメソッドからErrorがスローされます。

導入されたバージョン:
1.5
関連項目: