JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent.locks
クラス 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() メソッドを使用してチェックできます。

このクラスのコンストラクタは、オプションの 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 インタフェースの実装に加え、isLockedgetLockQueueLength、および計測や監視に役立つ関連 protected アクセスメソッドを定義します。

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

このロックは、1 つのスレッドで最大 2147483648 の再帰的ロックをサポートします。

導入されたバージョン:
1.5
関連項目:
直列化された形式

コンストラクタの概要
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
 

コンストラクタの詳細

ReentrantLock

public ReentrantLock()
ReentrantLock のインスタンスを作成します。これは、ReentrantLock(false) の使用と等価です。


ReentrantLock

public ReentrantLock(boolean fair)
指定された均等性ポリシーを使用して ReentrantLock のインスタンスを作成します。

パラメータ:
fair - このロックが均等である場合は true、そうでない場合は false
メソッドの詳細

lock

public void lock()
ロックを取得します。

ロックが別のスレッドに保持されていない場合、そのロックを取得してただちに復帰し、ロックの保持カウントを 1 に設定します。

現在のスレッドがロックをすでに保持している場合、保持カウントの値を 1 増分して、メソッドをただちに復帰します。

ロックが別のスレッドにより保持されている場合、現在のスレッドがスレッドスケジューリングに関して無効になり、ロックが取得されるまで待機します。ロックが取得されると、ロック保持カウントが 1 に設定されます。

定義:
インタフェース Lock 内の lock

lockInterruptibly

public void lockInterruptibly()
                       throws InterruptedException
現在のスレッドが interrupted でないかぎり、ロックを取得します。

ロックが別のスレッドに保持されていない場合、そのロックを取得してただちに復帰し、ロックの保持カウントを 1 に設定します。

現在のスレッドがロックをすでに保持している場合、保持カウントの値を 1 増分して、メソッドをただちに復帰します。

ロックが別のスレッドにより保持されている場合、現在のスレッドはスレッドのスケジューリングに関して無効になり、次の 2 つのいずれかが起きるまで待機します。

ロックが現在のスレッドにより取得された場合、ロック保持カウントが 1 に設定されます。

現在のスレッドで、

InterruptedException がスローされ、現在のスレッドの割り込みステータスがクリアされます。

このメソッドは明示的な割り込みポイントであるため、この実装では、通常または再入可能なロック取得への割り込みへの応答に高い優先度が与えられます。

定義:
インタフェース Lock 内の lockInterruptibly
例外:
InterruptedException - 現在のスレッドで割り込みが発生した場合
関連項目:
Thread.interrupt()

tryLock

public boolean tryLock()
呼び出し時に別のスレッドにより保持されていない場合にのみ、ロックを取得します。

別のスレッドにより保持されていない場合にロックを取得し、値 true でただちに復帰してロックの保持カウントを 1 に設定します。このロックが均等順序付けポリシーを使用するように設定されている場合でも、ロックが使用可能であれば、他のスレッドが現在ロックを待機しているかどうかに関係なく、tryLock() の呼び出しですぐにロックが取得されます。この「バージ」動作により均等性が失われるとは言え、これは特定の状況下で有用です。このロックの均等設定を尊重する場合は、ほぼ等価な tryLock(0, TimeUnit.SECONDS) を使用します (これも割り込みを検出する)。

現在のスレッドがロックをすでに保持している場合、保持カウントの値が 1 増分され、メソッドは true を返します。

ロックが別のスレッドにより保持されている場合、このメソッドは、値 false でただちに復帰します。

定義:
インタフェース Lock 内の tryLock
戻り値:
ロックがフリーで現在のスレッドにより取得されたか、ロックが現在のスレッドにより取得済みである場合は true、そうでない場合は false

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 内の tryLock
パラメータ:
timeout - ロックを待機する時間
unit - timeout 引数の時間単位
戻り値:
ロックがフリーで現在のスレッドにより所得されたか、ロックが現在のスレッドにより取得済みである場合は true、ロックを取得する前に待機時間が経過した場合は false
例外:
InterruptedException - 現在のスレッドで割り込みが発生した場合
NullPointerException - 単位が null の場合
関連項目:
Thread.interrupt()

unlock

public void unlock()
このロックの解放を試みます。

現在のスレッドがこのロックのホルダである場合、保持カウントの値が減らされます。保持カウントがゼロになると、ロックが解放されます。現在のスレッドがこのロックのホルダではない場合、IllegalMonitorStateException がスローされます。

定義:
インタフェース Lock 内の unlock
例外:
IllegalMonitorStateException - 現在のスレッドがこのロックを保持しない場合

newCondition

public Condition newCondition()
この Lock インスタンスで使用する Condition インスタンスを返します。

返される Condition インスタンスは、Object 監視メソッド (waitnotify、および notifyAll) を組み込み監視ロックで使用する場合と同じ使用方法をサポートします。

定義:
インタフェース Lock 内の newCondition
戻り値:
Condition オブジェクト

getHoldCount

public int getHoldCount()
現在のスレッドの、このロックに対する保持数を照会します。

スレッドには、ロック解除アクションと一致しないロックアクションごとに、ロック保持が存在します。

通常、保持カウント情報はテストおよびデバッグ用にのみ使用されます。たとえば、ロックを保持した状態で特定のコードセクションに入ってはならない場合、そのことを次のように表します。


 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...     
   public void m() { 
     assert lock.getHoldCount() == 0;
     lock.lock();
     try {
       // ... method body
     } finally {
       lock.unlock();
     }
   }
 }
 

戻り値:
現在のスレッドの、このロックに対する保持数。現在のスレッドがこのロックを保持していない場合はゼロ

isHeldByCurrentThread

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();
       }
   }
 }
 

戻り値:
現在のスレッドがロックを保持する場合は true、そうでない場合は false

isLocked

public boolean isLocked()
このロックがいずれかのスレッドにより保持されているかどうかを照会します。このメソッドは、同期を制御する目的ではなく、システムの状態を監視する目的で設計されています。

戻り値:
いずれかのスレッドがこのロックを保持している場合は true、そうでない場合は false

isFair

public final boolean isFair()
このロックで均等性が true に設定されている場合は true を返します。

戻り値:
このロックで均等性が true に設定されている場合は true

getOwner

protected Thread getOwner()
現在このロックを所有しているスレッドを返します。ロックが所有されていない場合は null を返します。ロックの取得を試みていてまだ取得していないスレッドが存在する場合も、所有者は一時的に null になる場合があります。このメソッドは、より包括的なロック監視機能を提供するサブクラスの構築を容易にする目的で設計されています。

戻り値:
所有者。所有されていない場合は null

hasQueuedThreads

public final boolean hasQueuedThreads()
このロックの取得を待機中のスレッドが存在するかどうかを照会します。取り消しはいつでも発生する可能性があるため、true が返されても、他のいずれかのスレッドがこのロックを取得することは保証されていません。このメソッドは、主にシステム状態の監視に使用する目的で設計されています。

戻り値:
ロックの取得を待機中の他のスレッドが存在する可能性がある場合は true

hasQueuedThread

public final boolean hasQueuedThread(Thread thread)
指定されたスレッドがこのロックの取得を待機中かどうかを照会します。取り消しはいつでも発生する可能性があるため、true が返されても、このスレッドがこのロックを取得することは保証されていません。このメソッドは、主にシステム状態の監視に使用する目的で設計されています。

パラメータ:
thread - スレッド
戻り値:
指定されたスレッドがキューに入れられており、このロックを待機中である場合は true
例外:
NullPointerException - スレッドが null の場合

getQueueLength

public final int getQueueLength()
このロックの取得を待機中のスレッドの推定数を返します。このメソッドが内部のデータ構造をトラバースしている間にも、スレッド数が動的に変化する場合があるため、この値は推定に過ぎません。このメソッドは、同期の制御用ではなく、システム状態を監視する目的で設計されています。

戻り値:
このロックを待機しているスレッドの推定数

getQueuedThreads

protected Collection<Thread> getQueuedThreads()
このロックの取得を待機しているスレッドを含むコレクションを返します。実際のスレッドセットは、結果の構築中にも動的に変化する可能性があるため、返されるコレクションは最善の努力を払った上での推定に過ぎません。返されるコレクションの要素には、特定の順序は存在しません。このメソッドは、より包括的な監視機能を提供するサブクラスの構築を容易にする目的で設計されています。

戻り値:
スレッドのコレクション

hasWaiters

public boolean hasWaiters(Condition condition)
このロックに関連付けられた指定状態で待機しているスレッドが存在するかどうかを照会します。タイムアウトおよび割り込みはいつでも発生する可能性があるため、true が返されても、将来 signal がスレッドを起動させることは保証されていません。このメソッドは、主にシステム状態の監視に使用する目的で設計されています。

パラメータ:
condition - 状態
戻り値:
待機中のスレッドが存在する場合は true
例外:
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合

getWaitQueueLength

public int getWaitQueueLength(Condition condition)
このロックに関連付けられた指定状態で待機中のスレッドの推定数を返します。タイムアウトおよび割り込みの発生する可能性はいつでも存在するため、推定数は、実際の待機者数に関する上限を示すに過ぎません。このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。

パラメータ:
condition - 状態
戻り値:
待機中のスレッドの推定数
例外:
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合

getWaitingThreads

protected Collection<Thread> getWaitingThreads(Condition condition)
このロックに関連付けられた指定状態を待機中のスレッドを含むコレクションを返します。実際のスレッドセットは、結果の構築中にも動的に変化する可能性があるため、返される結果は最善の努力を払った上での推定に過ぎません。返されるコレクションの要素には、特定の順序は存在しません。このメソッドは、より包括的な状態監視機能を提供するサブクラスの構築を容易にする目的で設計されています。

パラメータ:
condition - 状態
戻り値:
スレッドのコレクション
例外:
IllegalMonitorStateException - このロックを保持していない場合
IllegalArgumentException - 指定された状態がこのロックと関連付けられていない場合
NullPointerException - 状態が null の場合

toString

public String toString()
このロックを識別する文字列およびロック状態を返します。状態は括弧で囲まれ、文字列「Unlocked」または文字列「Locked by」に続いて、所有するスレッドの Thread.getName() が含まれます。

オーバーライド:
クラス Object 内の toString
戻り値:
このロックおよびその状態を識別する文字列

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。