| 
 | JavaTM 2 Platform Standard Ed. 5.0 | |||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.util.concurrent.locks.ReentrantLock
public class ReentrantLock
synchronized メソッドおよび文を使用してアクセスする暗黙の監視ロックと同じ基本動作およびセマンティクスを使用し、かつ拡張機能を持つ、再入可能な相互排他 Lock です。
 ReentrantLock は、最後にロックに成功したがまだロック解除していないスレッドにより「所有」されます。ロックが別のスレッドに所有されていない場合、lock を呼び出すスレッドが復帰してロックの取得に成功します。現在のスレッドがロックをすでに所有している場合、メソッドはただちに復帰します。これは、isHeldByCurrentThread() および getHoldCount() メソッドを使用してチェックできます。
 このクラスのコンストラクタは、オプションの fairness パラメータを受け入れます。これが 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 インタフェースの実装に加え、isLocked、getLockQueueLength、および計測や監視に役立つ関連 protected アクセスメソッドを定義します。
このクラスの直列化は、組み込みロックと同様に動作します。直列化解除されたロックは、直列化時の状態にかかわらず、ロック解除状態になります。
このロックは、1 つのスレッドで最大 2147483648 の再帰的ロックをサポートします。
| コンストラクタの概要 | |
|---|---|
| ReentrantLock()ReentrantLock のインスタンスを作成します。 | |
| ReentrantLock(boolean fair)指定された均等性ポリシーを使用して ReentrantLock のインスタンスを作成します。 | |
| メソッドの概要 | |
|---|---|
|  int | getHoldCount()現在のスレッドの、このロックに対する保持数を照会します。 | 
| protected  Thread | getOwner()現在このロックを所有しているスレッドを返します。 | 
| protected  Collection<Thread> | getQueuedThreads()このロックの取得を待機しているスレッドを含むコレクションを返します。 | 
|  int | getQueueLength()このロックの取得を待機中のスレッドの推定数を返します。 | 
| protected  Collection<Thread> | getWaitingThreads(Condition condition)このロックに関連付けられた指定状態を待機中のスレッドを含むコレクションを返します。 | 
|  int | getWaitQueueLength(Condition condition)このロックに関連付けられた指定状態で待機中のスレッドの推定数を返します。 | 
|  boolean | hasQueuedThread(Thread thread)指定されたスレッドがこのロックの取得を待機中かどうかを照会します。 | 
|  boolean | hasQueuedThreads()このロックの取得を待機中のスレッドが存在するかどうかを照会します。 | 
|  boolean | hasWaiters(Condition condition)このロックに関連付けられた指定状態で待機しているスレッドが存在するかどうかを照会します。 | 
|  boolean | isFair()このロックで均等性が true に設定されている場合は true を返します。 | 
|  boolean | isHeldByCurrentThread()現在のスレッドがこのロックを保持しているかどうかを照会します。 | 
|  boolean | isLocked()このロックがいずれかのスレッドにより保持されているかどうかを照会します。 | 
|  void | lock()ロックを取得します。 | 
|  void | lockInterruptibly()現在のスレッドが interruptedでないかぎり、ロックを取得します。 | 
|  Condition | newCondition()この Lockインスタンスで使用するConditionインスタンスを返します。 | 
|  String | toString()このロックを識別する文字列およびロック状態を返します。 | 
|  boolean | tryLock()呼び出し時に別のスレッドにより保持されていない場合にのみ、ロックを取得します。 | 
|  boolean | tryLock(long timeout,
        TimeUnit unit)指定された待機時間内に別のスレッドがロックを保持せず、現在のスレッドで 割り込みが発生していない場合に、ロックを取得します。 | 
|  void | unlock()このロックの解放を試みます。 | 
| クラス java.lang.Object から継承されたメソッド | 
|---|
| clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | 
| コンストラクタの詳細 | 
|---|
public ReentrantLock()
public ReentrantLock(boolean fair)
fair - このロックが均等である場合は true、そうでない場合は false| メソッドの詳細 | 
|---|
public void lock()
ロックが別のスレッドに保持されていない場合、そのロックを取得してただちに復帰し、ロックの保持カウントを 1 に設定します。
現在のスレッドがロックをすでに保持している場合、保持カウントの値を 1 増分して、メソッドをただちに復帰します。
ロックが別のスレッドにより保持されている場合、現在のスレッドがスレッドスケジューリングに関して無効になり、ロックが取得されるまで待機します。ロックが取得されると、ロック保持カウントが 1 に設定されます。
Lock 内の lock
public void lockInterruptibly()
                       throws InterruptedException
interrupted でないかぎり、ロックを取得します。
ロックが別のスレッドに保持されていない場合、そのロックを取得してただちに復帰し、ロックの保持カウントを 1 に設定します。
現在のスレッドがロックをすでに保持している場合、保持カウントの値を 1 増分して、メソッドをただちに復帰します。
ロックが別のスレッドにより保持されている場合、現在のスレッドはスレッドのスケジューリングに関して無効になり、次の 2 つのいずれかが起きるまで待機します。
割り込みを行う
 
ロックが現在のスレッドにより取得された場合、ロック保持カウントが 1 に設定されます。
現在のスレッドで、
割り込みが発生した場合、
 
InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
このメソッドは明示的な割り込みポイントであるため、この実装では、通常または再入可能なロック取得への割り込みへの応答に高い優先度が与えられます。
Lock 内の lockInterruptiblyInterruptedException - 現在のスレッドで割り込みが発生した場合Thread.interrupt()public boolean tryLock()
別のスレッドにより保持されていない場合にロックを取得し、値 true でただちに復帰してロックの保持カウントを 1 に設定します。このロックが均等順序付けポリシーを使用するように設定されている場合でも、ロックが使用可能であれば、他のスレッドが現在ロックを待機しているかどうかに関係なく、tryLock() の呼び出しですぐにロックが取得されます。この「バージ」動作により均等性が失われるとは言え、これは特定の状況下で有用です。このロックの均等設定を尊重する場合は、ほぼ等価な tryLock(0, TimeUnit.SECONDS) を使用します (これも割り込みを検出する)。
現在のスレッドがロックをすでに保持している場合、保持カウントの値が 1 増分され、メソッドは true を返します。
ロックが別のスレッドにより保持されている場合、このメソッドは、値 false でただちに復帰します。
Lock 内の tryLock
public boolean tryLock(long timeout,
                       TimeUnit unit)
                throws InterruptedException
割り込みが発生していない場合に、ロックを取得します。
別のスレッドがロックを保持していない場合にロックを取得し、値 true でただちに復帰して、ロック保持カウントを 1 に設定します。このロックが均等順序付けポリシーを使用するように設定されていても、他のスレッドが現在ロックを待機している場合は、使用可能なロックは取得されません。これは、tryLock() メソッドとは対照的です。均等ロックに対するバージを許可しない、時間設定された tryLock を使用する場合は、時間設定と非時間設定の両形式を組み合わせて使用します。
 
 
if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
 
現在のスレッドがロックをすでに保持している場合、保持カウントの値が 1 増分され、メソッドは true を返します。
ロックが別のスレッドにより保持されている場合、現在のスレッドはスレッドのスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。
割り込みを行う     
ロックが取得された場合、値 true が返され、ロック保持カウントが 1 に設定されます。
現在のスレッドで、
割り込みが発生した場合、
InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。
指定された待機時間が経過すると、値 false が返されます。時間がゼロまたはそれより小さい場合、メソッドは待機しません。
このメソッドは明示的な割り込みポイントであるため、この実装では、通常または再入可能なロック取得、および待機時間経過レポートへの割り込みに対する応答に高い優先度が与えられます。
Lock 内の tryLocktimeout - ロックを待機する時間unit - timeout 引数の時間単位
InterruptedException - 現在のスレッドで割り込みが発生した場合
NullPointerException - 単位が null の場合Thread.interrupt()public void unlock()
現在のスレッドがこのロックのホルダである場合、保持カウントの値が減らされます。保持カウントがゼロになると、ロックが解放されます。現在のスレッドがこのロックのホルダではない場合、IllegalMonitorStateException がスローされます。
Lock 内の unlockIllegalMonitorStateException - 現在のスレッドがこのロックを保持しない場合public Condition newCondition()
Lock インスタンスで使用する Condition インスタンスを返します。
返される Condition インスタンスは、Object 監視メソッド (wait、notify、および notifyAll) を組み込み監視ロックで使用する場合と同じ使用方法をサポートします。
 
Condition 待機または信号送信メソッドのどちらかが呼び出されたときにこのロックが保持されていない場合、IllegalMonitorStateException がスローされる
待機メソッドが呼び出されると、ロックが解放される。その後、ロックが再取得され、ロック保持カウントがメソッドの呼び出し時の状態に復元されてから、メソッドが復帰する
割り込みが発生すると、待機は終了し、InterruptedException がスローされ、スレッドの割り込み状態がクリアされる
Lock 内の newConditionpublic int getHoldCount()
スレッドには、ロック解除アクションと一致しないロックアクションごとに、ロック保持が存在します。
通常、保持カウント情報はテストおよびデバッグ用にのみ使用されます。たとえば、ロックを保持した状態で特定のコードセクションに入ってはならない場合、そのことを次のように表します。
 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...     
   public void m() { 
     assert lock.getHoldCount() == 0;
     lock.lock();
     try {
       // ... method body
     } finally {
       lock.unlock();
     }
   }
 }
 
public boolean isHeldByCurrentThread()
組み込み監視ロック用の Thread.holdsLock(java.lang.Object) メソッドと同様、このメソッドは通常、デバッグおよびテストに使用されます。たとえば、ロックが保持されている場合にのみ呼び出す必要のあるメソッドは、そのことを次のように示すことができます。
 
 
 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...
   public void m() { 
       assert lock.isHeldByCurrentThread();
       // ... method body
   }
 }
 
再入可能なロックが再入不可能な方法で確実に使用されるようにする場合にも、これを使用できます。次に例を示します。
 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...
   public void m() { 
       assert !lock.isHeldByCurrentThread();
       lock.lock();
       try {
           // ... method body
       } finally {
           lock.unlock();
       }
   }
 }
 
public boolean isLocked()
public final boolean isFair()
protected Thread getOwner()
public final boolean hasQueuedThreads()
public final boolean hasQueuedThread(Thread thread)
thread - スレッド
NullPointerException - スレッドが null の場合public final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
condition - 状態
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合public int getWaitQueueLength(Condition condition)
condition - 状態
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合protected Collection<Thread> getWaitingThreads(Condition condition)
condition - 状態
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合public String toString()
Thread.getName() が含まれます。
Object 内の toString| 
 | JavaTM 2 Platform Standard Ed. 5.0 | |||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。