|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.util.concurrent.locks.ReentrantReadWriteLock
public class ReentrantReadWriteLock
ReentrantLock と類似のセマンティクスをサポートする ReadWriteLock の実装。
このクラスには次のプロパティがあります。
このクラスは、ロックアクセスに対するリーダまたはライタの優先順序を規定しません。ただし、これはオプションの「均等」ポリシーをサポートします。均等として構築された場合、スレッドは近似の到着順ポリシーを使用してエントリで競合します。書き込みロックが解放されると、待機時間のもっとも長い単一のライタに書き込みロックが割り当てられるか、どのライタよりも長く待機しているリーダが存在する場合は、リーダのセットに読み込みロックが割り当てられます。不均等として構築された場合は、エントリをロックする順序を到着順にする必要はありません。いずれの場合にも、リーダがアクティブで、ライタがロックに入る場合、そのライタが書き込みロックを取得して解放するまで、後続のリーダには読み込みロックは許可されません。
このロックは、リーダとライタの両方が、ReentrantLock のスタイルで読み込みまたは書き込みロックを再取得することを許可します。書き込むスレッドの保持する書き込みロックがすべて解放されるまで、リーダは許可されません。
また、ライタは読み込みロックを取得できますが、リーダが書き込みロックを取得することはできません。他のアプリケーションの間では、読み込みロック下で読み込みを実行するメソッドへの呼び出しまたはコールバック中に書き込みロックが保持される場合、再入可能性は有用です。リーダが書き込みロックを取得しようとしても、成功しません。
再入可能性を利用すると、書き込みロックを取得してから読み込みロックを取得し、その後書き込みロックを解放するという方法で、書き込みロックから読み込みロックへの降格が可能になります。ただし、読み込みロックから書き込みロックへの昇格はできません。
読み込みロックと書き込みロックの両方が、ロック取得中の割り込みをサポートします。
Condition のサポート
書き込みロックの提供する Condition 実装は、書き込みロックに関し、ReentrantLock.newCondition() の提供する Condition 実装が ReentrantLock に対して実行するのと同じように動作します。当然ですが、この Condition は書き込みロックでのみ使用できます。
読み込みロックは Condition をサポートせず、readLock().newCondition() が UnsupportedOperationException をスローします。
このクラスは、ロックが保持されるか競合するかを判別するメソッドをサポートします。これらのメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。
このクラスの直列化は、組み込みロックと同様に動作します。直列化解除されたロックは、直列化時の状態にかかわらず、ロック解除状態になります。
使用例: 次のコード例では、再入可能性を活用して、キャッシュの更新後にロックの降格を実行する方法を示します (簡略化するために例外処理は省略されている)。
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 がスローされます。
| 入れ子のクラスの概要 | |
|---|---|
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 |
| コンストラクタの詳細 |
|---|
public ReentrantReadWriteLock()
public ReentrantReadWriteLock(boolean fair)
fair - このロックが均等順序付けポリシーを使用する場合は true| メソッドの詳細 |
|---|
public ReentrantReadWriteLock.WriteLock writeLock()
ReadWriteLock の記述:
ReadWriteLock 内の writeLockpublic ReentrantReadWriteLock.ReadLock readLock()
ReadWriteLock の記述:
ReadWriteLock 内の readLockpublic final boolean isFair()
protected Thread getOwner()
public int getReadLockCount()
public boolean isWriteLocked()
public boolean isWriteLockedByCurrentThread()
public int getWriteHoldCount()
protected Collection<Thread> getQueuedWriterThreads()
protected Collection<Thread> getQueuedReaderThreads()
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()
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 も参照してください。