JavaTM Platform
Standard Ed. 6

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) {
        // Must release read lock before acquiring write lock
        rwl.readLock().unlock();
        rwl.writeLock().lock();
        // Recheck state because another thread might have acquired
        //   write lock and changed state before we did.
        if (!cacheValid) {
          data = ...
          cacheValid = true;
        }
        // Downgrade by acquiring read lock before releasing write lock
        rwl.readLock().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(); }
    }
 }

実装上の注意:

このロックは、最大 65535 の再帰的書き込みロックおよび 65535 の読み込みロックをサポートします。これらの制限を超えようとすると、ロックするメソッドから 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 getReadHoldCount()
          現在のスレッドによる、このロック上の再入可能な読み込み保持数を照会します。
 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()
現在のスレッドによる、このロック上の再入可能な書き込み保持数を照会します。ライタースレッドは、ロック解除アクションと一致しない各ロックアクション用のロックを保持します。

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

getReadHoldCount

public int getReadHoldCount()
現在のスレッドによる、このロック上の再入可能な読み込み保持数を照会します。読み込みスレッドには、ロック解除アクションと一致しないロックアクションごとに、ロック保持が存在します。

戻り値:
現在のスレッドの、読み込みロックに対する保持数。現在のスレッドがこのロックを保持していない場合はゼロ
導入されたバージョン:
1.6

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 - condition が null の場合

getWaitQueueLength

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

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

getWaitingThreads

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

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

toString

public String toString()
このロックおよびその状態を識別する文字列を返します。状態は括弧で囲まれ、再入可能性を保持する書き込みロックの数に続く文字列 "Write locks ="、および保持される読み込みロックの数に続く文字列 "Read locks =" が含まれます。

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

JavaTM Platform
Standard Ed. 6

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

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