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 의 사용으로 병행성을 개선할 수 있습니다. 일반적으로, 이것이 가치가 있는 것은, 컬렉션이 대규모로 되는 것이 예상되어 라이터 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 됩니다.

도입된 버젼:
1.5
관련 항목:
직렬화 된 형식

상자의 클래스의 개요
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
 

생성자 의 상세

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()
현재 기입 락을 소유하고 있는 thread를 돌려줍니다. 락이 소유되어 있지 않은 경우는 null 를 돌려줍니다. 이 메소드가 소유자가 아닌 thread에 의해 불려 가는 경우, 반환값에는 현재의 락 상태의 최대한의 근사치가 반영됩니다. 예를 들어, 락의 취득을 시도하고 있어 아직 취득하고 있지 않는 thread가 존재하는 경우도, 소유자는 일시적으로 null 가 되는 경우가 있습니다. 이 메소드는, 보다 포괄적인 락 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.

반환값:
소유자. 소유되어 있지 않은 경우는 null

getReadLockCount

public int getReadLockCount()
이 락용으로 보관 유지되고 있는 read 락의 수를 조회합니다. 이 메소드는, 동기의 제어용으로서가 아니고, 시스템 상태의 감시용으로서 설계되고 있습니다.

반환값:
보관 유지하는 read 락의 수

isWriteLocked

public boolean isWriteLocked()
기입 락이 thread에 보관 유지되고 있는지 어떤지를 조회합니다. 이 메소드는, 동기의 제어용으로서가 아니고, 시스템 상태의 감시용으로서 설계되고 있습니다.

반환값:
임의의 thread가 기입해 락을 보관 유지하는 경우는 true, 그렇지 않은 경우는 false

isWriteLockedByCurrentThread

public boolean isWriteLockedByCurrentThread()
현재의 thread가 이 기입 락을 보관 유지하고 있는 제발을 조회합니다.

반환값:
현재의 thread가 기입해 락을 보관 유지하는 경우는 true, 그렇지 않은 경우는 false

getWriteHoldCount

public int getWriteHoldCount()
현재의 thread에 의한, 이 락상의 재입 가능한 기입 보관 유지수를 조회합니다. 라이터 thread는, 락 해제 액션과 일치하지 않는 각 락 액션용의 락을 보관 유지합니다.

반환값:
현재의 thread의, 기입 락에 대한 보관 유지수. 현재의 thread가 이 락을 보관 유지하고 있지 않는 경우는 제로

getReadHoldCount

public int getReadHoldCount()
현재의 thread에 의한, 이 락상의 재입 가능한 read 보관 유지수를 조회합니다. read thread에는, 락 해제 액션과 일치하지 않는 락 액션 마다, 락 보관 유지가 존재합니다.

반환값:
현재의 thread의, read 락에 대한 보관 유지수. 현재의 thread가 이 락을 보관 유지하고 있지 않는 경우는 제로
도입된 버젼:
1.6

getQueuedWriterThreads

protected Collection <Thread > getQueuedWriterThreads()
기입 락의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. 실제의 thread 세트는, 결과의 구축중에도 동적으로 변화할 가능성이 있기 (위해)때문에, 반환되는 컬렉션은 최선이 노력한 다음의 추정에 지나지 않습니다. 반환되는 컬렉션의 요소에는, 특정의 순서는 존재하지 않습니다. 이 메소드는, 보다 포괄적인 락 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.

반환값:
thread의 컬렉션

getQueuedReaderThreads

protected Collection <Thread > getQueuedReaderThreads()
read 락의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. 실제의 thread 세트는, 결과의 구축중에도 동적으로 변화할 가능성이 있기 (위해)때문에, 반환되는 컬렉션은 최선이 노력한 다음의 추정에 지나지 않습니다. 반환되는 컬렉션의 요소에는, 특정의 순서는 존재하지 않습니다. 이 메소드는, 보다 포괄적인 락 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.

반환값:
thread의 컬렉션

hasQueuedThreads

public final boolean hasQueuedThreads()
read 락 또는 기입해 락의 취득을 대기중의 thread가 존재할지 어떨지를 조회합니다. 취소는 언제라도 발생할 가능성이 있기 (위해)때문에,true 가 돌려주어져도, 다른 몇개의 thread가 락을 취득하는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.

반환값:
락의 취득을 대기중외의 thread가 존재할 가능성이 있는 경우는 true

hasQueuedThread

public final boolean hasQueuedThread(Thread  thread)
read 락 또는 기입해 락의 취득을 대기중의 지정의 thread가 존재할지 어떨지를 조회합니다. 취소는 언제라도 발생할 가능성이 있기 (위해)때문에,true 가 돌려주어져도, 이 thread가 락을 취득하는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.

파라미터:
thread - thread
반환값:
지정된 thread가 큐에 넣어지고 있어 이 락을 대기중인 경우는 true
예외:
NullPointerException - thread가 null 의 경우

getQueueLength

public final int getQueueLength()
read 락 또는 기입해 락의 취득을 대기중의 thread의 추정수를 돌려줍니다. 이 메소드가 내부의 데이터 구조를 횡단(traverse) 하고 있는 동안에도, thread수가 동적으로 변화하는 경우가 있기 (위해)때문에, 이 값은 추정에 지나지 않습니다. 이 메소드는, 동기의 제어용으로서가 아니고, 시스템 상태의 감시용으로서 설계되고 있습니다.

반환값:
이 락을 대기하고 있는 thread의 추정수

getQueuedThreads

protected Collection <Thread > getQueuedThreads()
read 락 또는 기입해 락의 몇개의 취득을 대기중의 thread를 포함한 컬렉션을 돌려줍니다. 실제의 thread 세트는, 결과의 구축중에도 동적으로 변화할 가능성이 있기 (위해)때문에, 반환되는 컬렉션은 최선이 노력한 다음의 추정에 지나지 않습니다. 반환되는 컬렉션의 요소에는, 특정의 순서는 존재하지 않습니다. 이 메소드는, 보다 포괄적인 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.

반환값:
thread의 컬렉션

hasWaiters

public boolean hasWaiters(Condition  condition)
이 기입 락에 관련지을 수 있었던 지정 상태로 대기하고 있는 thread가 존재할지 어떨지를 조회합니다. 타임 아웃 및 인터럽트는 언제라도 발생할 가능성이 있기 (위해)때문에,true 가 돌려주어져도, 장래 signal 가 thread를 기동시키는 것은 보증되고 있지 않습니다. 이 메소드는, 주로 시스템 상태의 감시에 사용하는 목적으로 설계되고 있습니다.

파라미터:
condition - 상태
반환값:
대기중의 thread가 존재하는 경우는 true
예외:
IllegalMonitorStateException - 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException - 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException - condition 가 null 의 경우

getWaitQueueLength

public int getWaitQueueLength(Condition  condition)
기입 락에 관련지을 수 있었던 지정 상태로 대기중의 thread의 추정수를 돌려줍니다. 타임 아웃 및 인터럽트의 발생할 가능성은 언제라도 존재하기 위해(때문에), 추정수는, 실제의 대기자수에 관한 상한을 나타내는에 지나지 않습니다. 이 메소드는, 동기의 제어용으로서가 아니고, 시스템 상태의 감시용으로서 설계되고 있습니다.

파라미터:
condition - 상태
반환값:
대기중의 thread의 추정수
예외:
IllegalMonitorStateException - 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException - 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException - condition 가 null 의 경우

getWaitingThreads

protected Collection <Thread > getWaitingThreads(Condition  condition)
기입 락에 관련지을 수 있었던 지정 상태를 대기중의 thread를 포함한 컬렉션을 돌려줍니다. 실제의 thread 세트는, 결과의 구축중에도 동적으로 변화할 가능성이 있기 (위해)때문에, 반환되는 컬렉션은 최선이 노력한 다음의 추정에 지나지 않습니다. 반환되는 컬렉션의 요소에는, 특정의 순서는 존재하지 않습니다. 이 메소드는, 보다 포괄적인 상태 감시 기능을 제공하는 서브 클래스의 구축을 용이하게 하는 목적으로 설계되고 있습니다.

파라미터:
condition - 상태
반환값:
thread의 컬렉션
예외:
IllegalMonitorStateException - 이 락을 보관 유지하고 있지 않는 경우
IllegalArgumentException - 지정된 상태가 이 락과 관련지을 수 있지 않은 경우
NullPointerException - condition 가 null 의 경우

toString

public String  toString()
이 락 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다. 상태는 괄호로 둘러싸여 재입가능성을 보관 유지하는 기입 락의 수에 계속되는 캐릭터 라인 "Write locks =", 및 보관 유지되는 read 락의 수에 계속되는 캐릭터 라인 "Read locks =" 가 포함됩니다.

오버라이드(override):
클래스 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 도 참조해 주세요.