|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.concurrent.locks.ReentrantReadWriteLock
public class ReentrantReadWriteLock
ReentrantLock
와 같은 시멘틱스를 지원하는 ReadWriteLock
의 구현입니다.
이 클래스에는 다음의 특성이 있습니다.
이 클래스는, 락 액세스에 대한 리더 또는 라이터의 우선 순서를 규정하지 않습니다. 다만, 이것은 옵션의 「공평성」정책를 지원합니다.
기입 락이 보관 유지되고 있는 경우나 대기중의 라이터 thread가 존재하는 경우, 공평 read 락 (재입불가능)을 취득하려고 하는 thread는 블록 됩니다. 그러한 thread는, 현재 대기중의 라이터 thread 가운데 좀 더도 낡은 thread가 기입해 락을 취득해 해제할 때까지, read 락을 취득하지 않습니다. 물론, 대기중의 라이터가 대기를 중지해, 큐내에서 가장 길게 대기하고 있는 1 개(살) 이상의 리더 thread에 기입해 락이 걸리지 않은 경우는, 그러한 리더에게 읽어들여 락을 할당할 수 있습니다.
read 락도 기입해 락도 걸리지 않은 (즉 대기중의 thread가 없다) 경우를 제외해, 공평 기입 락 (재입불가능)을 취득하려고 하는 thread는 블록 됩니다. 다만, 비블록의 ReentrantReadWriteLock.ReadLock.tryLock()
및 ReentrantReadWriteLock.WriteLock.tryLock()
메소드는, 이 공평 설정에 따르지 않고, 대기중의 thread에 관계없이, 가능하면 락을 가져옵니다.
이 락은, 리더와 라이터의 양쪽 모두가,ReentrantLock
의 스타일로 읽어들여 또는 기입해 락을 재취득하는 것을 허가합니다. 기입하는 thread의 보관 유지하는 기입 락이 모두 해제될 때까지, 재입 불가능한 리더는 허가되지 않습니다.
또, 라이터는 읽어들여 락을 취득할 수 있습니다만, 리더가 기입해 락을 취득할 수 없습니다. 다른 어플리케이션의 사이에서는, read 락하에서 read를 실행하는 메소드에의 호출해 또는 콜백중에 기입해 락이 보관 유지되는 경우, 재입가능성은 유용합니다. 리더가 기입해 락을 취득하려고 해도, 성공하지 않습니다.
재입가능성을 이용하면(자), 기입 락을 취득하고 나서 read 락을 취득해, 그 후 기입해 락을 해제한다고 하는 방법으로, 기입 락으로부터 읽어들여 락에의 격하가 가능하게 됩니다. 다만, read 락으로부터 기입해 락에의 승격은 할 수 없습니다.
read 락과 기입해 락의 양쪽 모두가, 락 취득중의 인터럽트를 지원합니다.
Condition
의 지원 기입 락의 제공하는 Condition
구현은, 기입 락에 관계되어,ReentrantLock.newCondition()
의 제공하는 Condition
구현이 ReentrantLock
에 대해서 실행하는 것과 같이 동작합니다. 당연합니다만, 이 Condition
는 기입해 락에서만 사용할 수 있습니다.
read 락은 Condition
를 지원하지 않고,readLock(). newCondition()
가 UnsupportedOperationException
를 throw 합니다.
이 클래스는, 락이 보관 유지되는지 경합 하는지를 판별하는 메소드를 지원합니다. 이러한 메소드는, 동기의 제어용으로서가 아니고, 시스템 상태의 감시용으로서 설계되고 있습니다.
이 클래스의 직렬화는, 편입 락과 같게 동작합니다. 직렬화 해제된 락은, 직렬화시 상태에 관계없이, 락 해제 상태가 됩니다.
사용례:차의 코드예에서는, 재입가능성을 활용해, 캐쉬의 갱신 후에 락의 격하를 실행하는 방법을 나타냅니다 (간략화하기 위해서 예외 처리는 생략 되고 있다).
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 의 사용으로 병행성을 개선할 수 있습니다. 일반적으로, 이것이 가치가 있는 것은, 컬렉션이 대규모로 되는 것이 예상되어 라이터 thread보다 다수의 리더 thread에 의해 액세스 되어 동기에 의한 오버헤드를 웃도는 오버헤드를 가지는 조작이 포함되는 경우입니다. 예로서 대규모여, 병행 액세스가 예상되는 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 의 read 락을 지원합니다. 이러한 제한을 넘으려고 하면(자), 잠그는 메소드로부터 Error
가 throw 됩니다.
상자의 클래스의 개요 | |
---|---|
static class |
ReentrantReadWriteLock.ReadLock
readLock() 메소드에 의해 반환되는 락입니다. |
static class |
ReentrantReadWriteLock.WriteLock
writeLock() 메소드에 의해 반환되는 락입니다. |
생성자 의 개요 | |
---|---|
ReentrantReadWriteLock ()
디폴트 (불공평)의 순서 프로퍼티으로, 신규 ReentrantReadWriteLock 를 작성합니다. |
|
ReentrantReadWriteLock (boolean fair)
지정된 공평성 정책를 사용해, 신규 ReentrantReadWriteLock 를 작성합니다. |
메소드의 개요 | |
---|---|
protected Thread |
getOwner ()
현재 기입 락을 소유하고 있는 thread를 돌려줍니다. |
protected Collection <Thread > |
getQueuedReaderThreads ()
read 락의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. |
protected Collection <Thread > |
getQueuedThreads ()
read 락 또는 기입해 락의 몇개의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. |
protected Collection <Thread > |
getQueuedWriterThreads ()
기입 락의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. |
int |
getQueueLength ()
read 락 또는 기입해 락의 취득을 대기중의 thread의 추정수를 돌려줍니다. |
int |
getReadHoldCount ()
현재의 thread에 의한, 이 락상의 재입 가능한 read 보관 유지수를 조회합니다. |
int |
getReadLockCount ()
이 락용으로 보관 유지되고 있는 read 락의 수를 조회합니다. |
protected Collection <Thread > |
getWaitingThreads (Condition condition)
기입 락에 관련지을 수 있었던 지정 상태를 대기중의 thread를 포함한 컬렉션을 돌려줍니다. |
int |
getWaitQueueLength (Condition condition)
기입 락에 관련지을 수 있었던 지정 상태로 대기중의 thread의 추정수를 돌려줍니다. |
int |
getWriteHoldCount ()
현재의 thread에 의한, 이 락상의 재입 가능한 기입 보관 유지수를 조회합니다. |
boolean |
hasQueuedThread (Thread thread)
read 락 또는 기입해 락의 취득을 대기중의 지정의 thread가 존재할지 어떨지를 조회합니다. |
boolean |
hasQueuedThreads ()
read 락 또는 기입해 락의 취득을 대기중의 thread가 존재할지 어떨지를 조회합니다. |
boolean |
hasWaiters (Condition condition)
이 기입 락에 관련지을 수 있었던 지정 상태로 대기하고 있는 thread가 존재할지 어떨지를 조회합니다. |
boolean |
isFair ()
이 락으로 공평성이 true 로 설정되어 있는 경우는 true 를 돌려줍니다. |
boolean |
isWriteLocked ()
기입 락이 thread에 보관 유지되고 있는지 어떤지를 조회합니다. |
boolean |
isWriteLockedByCurrentThread ()
현재의 thread가 이 기입 락을 보관 유지하고 있는 제발을 조회합니다. |
ReentrantReadWriteLock.ReadLock |
readLock ()
읽어들여에 사용하는 락을 돌려줍니다. |
String |
toString ()
이 락 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다. |
ReentrantReadWriteLock.WriteLock |
writeLock ()
기입해에 사용하는 락을 돌려줍니다. |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
clone , equals , finalize , getClass , hashCode , notify , notifyAll , wait , wait , wait |
생성자 의 상세 |
---|
public ReentrantReadWriteLock()
ReentrantReadWriteLock
를 작성합니다.
public ReentrantReadWriteLock(boolean fair)
ReentrantReadWriteLock
를 작성합니다.
fair
- 이 락이 공평 순서부 정책를 사용하는 경우는 true
메소드의 상세 |
---|
public ReentrantReadWriteLock.WriteLock writeLock()
ReadWriteLock
의 기술:
ReadWriteLock
내의 writeLock
public ReentrantReadWriteLock.ReadLock readLock()
ReadWriteLock
의 기술:
ReadWriteLock
내의 readLock
public final boolean isFair()
true
를 돌려줍니다.
true
protected Thread getOwner()
null
를 돌려줍니다. 이 메소드가 소유자가 아닌 thread에 의해 불려 가는 경우, 반환값에는 현재의 락 상태의 최대한의 근사치가 반영됩니다. 예를 들어, 락의 취득을 시도하고 있어 아직 취득하고 있지 않는 thread가 존재하는 경우도, 소유자는 일시적으로 null
가 되는 경우가 있습니다. 이 메소드는, 보다 포괄적인 락 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.
null
public int getReadLockCount()
public boolean isWriteLocked()
true
, 그렇지 않은 경우는 false
public boolean isWriteLockedByCurrentThread()
true
, 그렇지 않은 경우는 false
public int getWriteHoldCount()
public int getReadHoldCount()
protected Collection <Thread > getQueuedWriterThreads()
protected Collection <Thread > getQueuedReaderThreads()
public final boolean hasQueuedThreads()
true
가 돌려주어져도, 다른 몇개의 thread가 락을 취득하는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.
true
public final boolean hasQueuedThread(Thread thread)
true
가 돌려주어져도, 이 thread가 락을 취득하는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.
thread
- thread
true
NullPointerException
- thread가 null 의 경우public final int getQueueLength()
protected Collection <Thread > getQueuedThreads()
public boolean hasWaiters(Condition condition)
true
가 돌려주어져도, 장래 signal
가 thread를 기동시키는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.
condition
- 상태
true
IllegalMonitorStateException
- 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException
- 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException
- condition 가 null 의 경우public int getWaitQueueLength(Condition condition)
condition
- 상태
IllegalMonitorStateException
- 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException
- 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException
- condition 가 null 의 경우protected Collection <Thread > getWaitingThreads(Condition condition)
condition
- 상태
IllegalMonitorStateException
- 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException
- 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException
- condition 가 null 의 경우public String toString()
"Write locks ="
, 및 보관 유지되는 read 락의 수에 계속되는 캐릭터 라인 "Read locks ="
가 포함됩니다.
Object
내의 toString
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.