JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent.locks
クラス ReentrantReadWriteLock

java.lang.Object
  上位を拡張 java.util.concurrent.locks.ReentrantReadWriteLock
すべての実装されたインタフェース:
Serializable, ReadWriteLock

public class ReentrantReadWriteLock
extends Object
implements ReadWriteLock, Serializable

ReentrantLock と類似のセマンティクスをサポートする ReadWriteLock の実装。

このクラスには次のプロパティがあります。

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

使用例: 次のコード例では、再入可能性を活用して、キャッシュの更新後にロックの降格を実行する方法を示します (簡略化するために例外処理は省略されている)。


 class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // upgrade lock manually
        rwl.readLock().unlock();   // must unlock first to obtain writelock
        rwl.writeLock().lock();
        if (!cacheValid) { // recheck
          data = ...
          cacheValid = true;
        }
        // downgrade lock
        rwl.readLock().lock();  // reacquire read without giving up write lock
        rwl.writeLock().unlock(); // unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }
 
ReentrantReadWriteLocks を使用して、ある種の Collections の使用で並行性を改善できます。通常、これが価値があるのは、コレクションが大規模になることが予想され、ライタスレッドよりも多数のリーダスレッドによりアクセスされ、同期によるオーバーヘッドを上回るオーバーヘッドを持つ操作が含まれる場合です。例として、大規模で、同時アクセスが予想される TreeMap を使用するクラスを以下に示します。

 class RWDictionary {
    private final Map<String, Data>  m = new TreeMap<String, Data>();
    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock r = rwl.readLock();
    private final Lock w = rwl.writeLock();

    public Data get(String key) {
        r.lock(); try { return m.get(key); } finally { r.unlock(); }
    }
    public String[] allKeys() {
        r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); }
    }
    public Data put(String key, Data value) {
        w.lock(); try { return m.put(key, value); } finally { w.unlock(); }
    }
    public void clear() {
        w.lock(); try { m.clear(); } finally { w.unlock(); }
    }
 }
 

実装上の注意:

再入可能な書き込みロックは、所有者を本来定義するもので、ロックを解放できるのは取得したスレッドだけです。対照的に、この実装では、読み込みロックに所有権という概念は存在しないため、読み込みロックを解放するスレッドがそれを取得するスレッドと同じでなければならないということはありません。ただし、このプロパティは、このクラスの将来の実装で保持されることは保証されていません。

このロックは、最大 65536 の再帰的書き込みロックおよび 65536 の読み込みロックをサポートします。これらの制限を超えようとすると、ロックするメソッドから Error がスローされます。

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

入れ子のクラスの概要
static class ReentrantReadWriteLock.ReadLock
          readLock() メソッドにより返されるロック
static class ReentrantReadWriteLock.WriteLock
          writeLock() メソッドにより返されるロック
 
コンストラクタの概要
ReentrantReadWriteLock()
          デフォルトの順序プロパティで、新規 ReentrantReadWriteLock を作成します。
ReentrantReadWriteLock(boolean fair)
          指定された均等性ポリシーを使用して、新規 ReentrantReadWriteLock を作成します。
 
メソッドの概要
protected  Thread getOwner()
          現在書き込みロックを所有しているスレッドを返します。
protected  Collection<Thread> getQueuedReaderThreads()
          読み込みロックの取得を待機中のスレッドを含むコレクションを返します。
protected  Collection<Thread> getQueuedThreads()
          読み込みロックまたは書き込みロックのいずれかの取得を待機中のスレッドを含むコレクションを返します。
protected  Collection<Thread> getQueuedWriterThreads()
          書き込みロックの取得を待機中のスレッドを含むコレクションを返します。
 int getQueueLength()
          読み込みロックまたは書き込みロックの取得を待機中のスレッドの推定数を返します。
 int getReadLockCount()
          このロック用に保持されている読み込みロックの数を照会します。
protected  Collection<Thread> getWaitingThreads(Condition condition)
          書き込みロックに関連付けられた指定状態を待機中のスレッドを含むコレクションを返します。
 int getWaitQueueLength(Condition condition)
          書き込みロックに関連付けられた指定状態で待機中のスレッドの推定数を返します。
 int getWriteHoldCount()
          現在のスレッドによる、このロック上の再入可能な書き込み保持数を照会します。
 boolean hasQueuedThread(Thread thread)
          読み込みロックまたは書き込みロックの取得を待機中の指定のスレッドが存在するかどうかを照会します。
 boolean hasQueuedThreads()
          読み込みロックまたは書き込みロックの取得を待機中のスレッドが存在するかどうかを照会します。
 boolean hasWaiters(Condition condition)
          この書き込みロックに関連付けられた指定状態で待機しているスレッドが存在するかどうかを照会します。
 boolean isFair()
          このロックで均等性が true に設定されている場合は true を返します。
 boolean isWriteLocked()
          書き込みロックがスレッドに保持されているかどうかを照会します。
 boolean isWriteLockedByCurrentThread()
          現在のスレッドがこの書き込みロックを保持しているどうかを照会します。
 ReentrantReadWriteLock.ReadLock readLock()
          読み込みに使用するロックを返します。
 String toString()
          このロックおよびその状態を識別する文字列を返します。
 ReentrantReadWriteLock.WriteLock writeLock()
          書き込みに使用するロックを返します。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

コンストラクタの詳細

ReentrantReadWriteLock

public ReentrantReadWriteLock()
デフォルトの順序プロパティで、新規 ReentrantReadWriteLock を作成します。


ReentrantReadWriteLock

public ReentrantReadWriteLock(boolean fair)
指定された均等性ポリシーを使用して、新規 ReentrantReadWriteLock を作成します。

パラメータ:
fair - このロックが均等順序付けポリシーを使用する場合は true
メソッドの詳細

writeLock

public ReentrantReadWriteLock.WriteLock writeLock()
インタフェース ReadWriteLock の記述:
書き込みに使用するロックを返します。

定義:
インタフェース ReadWriteLock 内の writeLock
戻り値:
書き込みに使用するロック

readLock

public ReentrantReadWriteLock.ReadLock readLock()
インタフェース ReadWriteLock の記述:
読み込みに使用するロックを返します。

定義:
インタフェース ReadWriteLock 内の readLock
戻り値:
読み込みに使用するロック

isFair

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

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

getOwner

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

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

getReadLockCount

public int getReadLockCount()
このロック用に保持されている読み込みロックの数を照会します。このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。

戻り値:
保持する読み込みロックの数

isWriteLocked

public boolean isWriteLocked()
書き込みロックがスレッドに保持されているかどうかを照会します。このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。

戻り値:
いずれかのスレッドが書き込みロックを保持する場合は true、そうでない場合は false

isWriteLockedByCurrentThread

public boolean isWriteLockedByCurrentThread()
現在のスレッドがこの書き込みロックを保持しているどうかを照会します。

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

getWriteHoldCount

public int getWriteHoldCount()
現在のスレッドによる、このロック上の再入可能な書き込み保持数を照会します。ライタスレッドは、ロック解除アクションと一致しない各ロックアクション用のロックを保持します。

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

getQueuedWriterThreads

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

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

getQueuedReaderThreads

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

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

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()
このロックおよびその状態を識別する文字列を返します。状態は括弧で囲まれ、文字列「Write locks =」に続いて再入可能性を保持する書き込みロックの数、および文字列「Read locks =」に続いて保持される読み込みロックの数が含まれます。

オーバーライド:
クラス 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 も参照してください。