JavaTM Platform
Standard Ed. 6

java.util.concurrent.locks
클래스 ReentrantLock

java.lang.Object 
  상위를 확장 java.util.concurrent.locks.ReentrantLock
모든 구현된 인터페이스:
Serializable , Lock


public class ReentrantLock
extends Object
implements Lock , Serializable

synchronized 메소드 및 문장을 사용해 액세스 하는 암묵의 감시 락과 같은 기본 동작 및 시멘틱스를 사용해, 한편 확장 기능을 가지는, 재입 가능한 상호 배타 Lock 입니다.

ReentrantLock 는, 마지막에 락에 성공했지만 아직 락 해제하고 있지 않는 thread에 의해 「소유」됩니다. 락이 다른 thread에 소유되어 있지 않은 경우,lock 를 호출하는 thread가 복귀해 락의 취득에 성공합니다. 현재의 thread가 락을 벌써 소유하고 있는 경우, 메소드는 즉시 복귀합니다. 이것은,isHeldByCurrentThread()getHoldCount() 메소드를 사용해 체크할 수 있습니다.

이 클래스의 생성자 은, 옵션의 「공평성」파라미터를 받아들입니다. 이것이 true 로 설정되면(자), 경합이 존재하는 경우, 락은 가장 길게 대기하고 있는 thread에의 액세스를 허가하도록(듯이) 응답합니다. 그렇지 않은 경우, 이 락이 특정의 액세스순서를 보증할 것은 없습니다. 다수의 thread에 의해 액세스 되는 공평 락을 사용하는 프로그램은, 디폴트 설정을 사용하는 프로그램보다 낮은 (보다 저속인, 많은 경우 매우 저속인) 전체 throughput를 표시하는 경우가 있습니다만, 락을 취득할 때의 변동은 보다 작아져, 고갈하지 않는 것이 보증됩니다. 다만, 락의 공평성에 의해, thread 스케줄링의 공평성이 보증되는 것은 아닙니다. 이 때문에, 공평 락을 사용하는 다수의 thread의 1 개가 여러 차례 연속해 취득해, 액티브한 다른 thread의 진척을 보지 못하고, 락을 보관 유지하고 있지 않는 상태가 될 수도 있습니다. 또, 시간 지정이 없는 tryLock 메소드는 공평성 설정을 존중하지 않고, 받아들이지 않습니다. 다른 thread가 대기 그 중에서 락이 유효하면 이 메소드는 성공합니다.

lock 의 호출의 직후에 try 블록을 계속하는 것이, 항상 추천 되고 있습니다. 일반적으로, 다음의 구축을 실행하기 전/후에 실행합니다.

 class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }
 

이 클래스는,Lock 인터페이스의 구현에 가세해isLocked,getLockQueueLength, 및 계측이나 감시에 도움이 되는 관련 protected 액세스 메소드를 정의합니다.

이 클래스의 직렬화는, 편입 락과 같게 동작합니다. 직렬화 해제된 락은, 직렬화시 상태에 관계없이, 락 해제 상태가 됩니다.

이 락은, 1 개의 thread로 최대 2147483647 의 재귀적 락을 지원합니다. 이 제한을 넘으려고 하면(자), 잠그는 메소드로부터 Error 가 throw 됩니다.

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

생성자 의 개요
ReentrantLock ()
          ReentrantLock 의 인스턴스를 작성합니다.
ReentrantLock (boolean fair)
          지정된 공평성 정책를 사용해 ReentrantLock 의 인스턴스를 작성합니다.
 
메소드의 개요
 int getHoldCount ()
          현재의 thread의, 이 락에 대한 보관 유지수를 조회합니다.
protected  Thread getOwner ()
          현재 이 락을 소유하고 있는 thread를 돌려줍니다.
protected  Collection <Thread > getQueuedThreads ()
          이 락의 취득을 대기하고 있는 thread를 포함한 컬렉션을 돌려줍니다.
 int getQueueLength ()
          이 락의 취득을 대기중의 thread의 추정수를 돌려줍니다.
protected  Collection <Thread > getWaitingThreads (Condition  condition)
          이 락에 관련지을 수 있었던 지정 상태를 대기중의 thread를 포함한 컬렉션을 돌려줍니다.
 int getWaitQueueLength (Condition  condition)
          이 락에 관련지을 수 있었던 지정 상태로 대기중의 thread의 추정수를 돌려줍니다.
 boolean hasQueuedThread (Thread  thread)
          지정된 thread가 이 락의 취득을 대기중인가 어떤가를 조회합니다.
 boolean hasQueuedThreads ()
          이 락의 취득을 대기중의 thread가 존재할지 어떨지를 조회합니다.
 boolean hasWaiters (Condition  condition)
          이 락에 관련지을 수 있었던 지정 상태로 대기하고 있는 thread가 존재할지 어떨지를 조회합니다.
 boolean isFair ()
          이 락으로 공평성이 true 로 설정되어 있는 경우는 true 를 돌려줍니다.
 boolean isHeldByCurrentThread ()
          현재의 thread가 이 락을 보관 유지하고 있을지 어떨지를 조회합니다.
 boolean isLocked ()
          이 락이 몇개의 thread에 의해 보관 유지되고 있는지 어떤지를 조회합니다.
 void lock ()
          락을 가져옵니다.
 void lockInterruptibly ()
          현재의 thread가 interrupted 가 아닌 한, 락을 가져옵니다.
 Condition newCondition ()
          이 Lock 인스턴스로 사용하는 Condition 인스턴스를 돌려줍니다.
 String toString ()
          이 락 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다.
 boolean tryLock ()
          호출시에 다른 thread에 의해 보관 유지되어 있지 않은 경우에게만, 락을 가져옵니다.
 boolean tryLock (long timeout, TimeUnit  unit)
          지정된 대기 시간내에 다른 thread가 락을 보관 유지하지 않고, 현재의 thread로인터럽트가 발생하고 있지 않는 경우에, 락을 가져옵니다.
 void unlock ()
          이 락의 해제을 시도합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , wait , wait , wait
 

생성자 의 상세

ReentrantLock

public ReentrantLock()
ReentrantLock 의 인스턴스를 작성합니다. 이것은,ReentrantLock(false) 의 사용과 등가입니다.


ReentrantLock

public ReentrantLock(boolean fair)
지정된 공평성 정책를 사용해 ReentrantLock 의 인스턴스를 작성합니다.

파라미터:
fair - 이 락이 공평 순서부 정책를 사용하는 경우는 true
메소드의 상세

lock

public void lock()
락을 가져옵니다.

락이 다른 thread에 보관 유지되어 있지 않은 경우, 그 락을 취득해 즉시 복귀해, 락의 보관 유지 카운트를 1 으로 설정합니다.

현재의 thread가 락을 벌써 보관 유지하고 있는 경우, 보관 유지 카운트의 값을 1 증분 해, 메소드를 즉시 복귀합니다.

락이 다른 thread에 의해 보관 유지되고 있는 경우, 현재의 thread가 thread 스케줄링에 관해서 무효가 되어, 락이 취득될 때까지 대기합니다. 락이 취득되면(자), 락 보관 유지 카운트가 1 으로 설정됩니다.

정의:
인터페이스 Lock 내의 lock

lockInterruptibly

public void lockInterruptibly()
                       throws InterruptedException 
현재의 thread가 interrupted 가 아닌 한, 락을 가져옵니다.

락이 다른 thread에 보관 유지되어 있지 않은 경우, 그 락을 취득해 즉시 복귀해, 락의 보관 유지 카운트를 1 으로 설정합니다.

현재의 thread가 락을 벌써 보관 유지하고 있는 경우, 보관 유지 카운트의 값을 1 증분 해, 메소드를 즉시 복귀합니다.

락이 다른 thread에 의해 보관 유지되고 있는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.

락이 현재의 thread에 의해 취득되었을 경우, 락 보관 유지 카운트가 1 으로 설정됩니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

이 메소드는 명시적인 끼어들어 포인트이기 (위해)때문에, 이 구현에서는, 일반적으로 또는 재입 가능한 락 취득에의 인터럽트에의 응답에 높은 우선도가 주어집니다.

정의:
인터페이스 Lock 내의 lockInterruptibly
예외:
InterruptedException - 현재의 thread로 인터럽트가 발생했을 경우

tryLock

public boolean tryLock()
호출시에 다른 thread에 의해 보관 유지되어 있지 않은 경우에게만, 락을 가져옵니다.

다른 thread가 락을 보관 유지하고 있지 않는 경우에 락을 취득해, 값 true 로 즉시 복귀해, 락 보관 유지 카운트를 1 으로 설정합니다. 이 락이 공평 순서부 정책를 사용하도록(듯이) 설정되어 있는 경우에서도, 락이 사용 가능하면, 다른 thread가 현재 락을 대기하고 있을지 어떨지에 관계없이,tryLock() 의 호출로 곧바로 락이 취득됩니다. 이 「인터럽트」(barging) 동작에 의해 공평성이 없어진다고는 말할 수 있어 이것은 특정의 상황하로 유용합니다. 이 락의 공평성 설정을 존중하는 경우는, 거의 등가인 tryLock(0, TimeUnit.SECONDS) 를 사용합니다 (이것도 인터럽트를 검출한다).

현재의 thread가 락을 벌써 보관 유지하고 있는 경우, 보관 유지 카운트의 값을 1 증분 해,true 로 복귀합니다.

락이 다른 thread에 의해 보관 유지되고 있는 경우, 이 메소드는, 값 false 로 즉시 복귀합니다.

정의:
인터페이스 Lock 내의 tryLock
반환값:
락되어 있지 않은 상태로, 현재의 thread에 의해 락이 취득되었는지, 락이 현재의 thread에 의해 취득이 끝난 상태인 경우는 true, 그렇지 않은 경우는 false

tryLock

public boolean tryLock(long timeout,
                       TimeUnit  unit)
                throws InterruptedException 
지정된 대기 시간내에 다른 thread가 락을 보관 유지하지 않고, 현재의 thread로인터럽트가 발생하고 있지 않는 경우에, 락을 가져옵니다.

다른 thread가 락을 보관 유지하고 있지 않는 경우에 락을 취득해, 값 true 로 즉시 복귀해, 락 보관 유지 카운트를 1 으로 설정합니다. 이 락이 공평 순서부 정책를 사용하도록(듯이) 설정되어 있어도, 다른 thread가 락을 대기하고 있는 경우는, 사용 가능한 락은 취득되지 않습니다. 이것은,tryLock() 메소드와는 대조적입니다. 공평 락에 대한 화물 운반선을 허가하지 않는, 시간 설정된 tryLock 를 사용하는 경우는, 시간 설정과 비시간 설정의 양형식을 조합해 사용합니다.

if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... }
 

현재의 thread가 락을 벌써 보관 유지하고 있는 경우, 보관 유지 카운트의 값을 1 증분 해,true 로 복귀합니다.

락이 다른 thread에 의해 보관 유지되고 있는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.

락이 취득되었을 경우, 값 true 가 돌려주어져 락 보관 유지 카운트가 1 으로 설정됩니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

지정된 대기 시간이 경과하면(자), 값 false 가 돌려주어집니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.

이 메소드는 명시적인 끼어들어 포인트이기 (위해)때문에, 이 구현에서는, 일반적으로 또는 재입 가능한 락 취득, 및 대기 시간 경과 리포트에의 인터럽트에 대한 응답에 높은 우선도가 주어집니다.

정의:
인터페이스 Lock 내의 tryLock
파라미터:
timeout - 락을 대기하는 시간
unit - timeout 인수의 시간 단위
반환값:
락되어 있지 않은 상태로, 현재의 thread에 의해 락이 취득되었는지, 락이 현재의 thread에 의해 취득이 끝난 상태인 경우는 true, 락을 취득하기 전에 대기 시간이 경과했을 경우는 false
예외:
InterruptedException - 현재의 thread로 인터럽트가 발생했을 경우
NullPointerException - 시간 단위가 null 의 경우

unlock

public void unlock()
이 락의 해제을 시도합니다.

현재의 thread가 이 락의 홀더인 경우, 보관 유지 카운트의 값이 줄여집니다. 보관 유지 카운트가 제로가 되면(자), 락이 해제됩니다. 현재의 thread가 이 락의 홀더가 아닌 경우,IllegalMonitorStateException 가 throw 됩니다.

정의:
인터페이스 Lock 내의 unlock
예외:
IllegalMonitorStateException - 현재의 thread가 이 락을 보관 유지하지 않는 경우

newCondition

public Condition  newCondition()
Lock 인스턴스로 사용하는 Condition 인스턴스를 돌려줍니다.

반환되는 Condition 인스턴스는,Object 감시 메소드 (wait ,notify , 및 notifyAll )를 편입 감시 락으로 사용하는 경우와 같은 사용 방법을 지원합니다.

정의:
인터페이스 Lock 내의 newCondition
반환값:
Condition 객체

getHoldCount

public int getHoldCount()
현재의 thread의, 이 락에 대한 보관 유지수를 조회합니다.

thread에는, 락 해제 액션과 일치하지 않는 락 액션 마다, 락 보관 유지가 존재합니다.

일반적으로, 보관 유지 카운트 정보는 테스트 및 디버그용으로만 사용됩니다. 예를 들어, 락을 보관 유지한 상태로 특정의 코드 섹션에 들어가서는 안 되는 경우, 그것을 다음과 같이 나타냅니다.

 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...
   public void m() {
     assert lock.getHoldCount() == 0;
     lock.lock();
     try {
       // ... method body
     } finally {
       lock.unlock();
     }
   }
 }
 

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

isHeldByCurrentThread

public boolean isHeldByCurrentThread()
현재의 thread가 이 락을 보관 유지하고 있을지 어떨지를 조회합니다.

편입 감시 락용의 Thread.holdsLock(java.lang.Object) 메소드와 같이, 이 메소드는 일반적으로, 디버그 및 테스트에 사용됩니다. 예를 들어, 락이 보관 유지되고 있는 경우에게만 호출할 필요가 있는 메소드는, 그것을 다음과 같이 가리킬 수가 있습니다.

 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
       assert lock.isHeldByCurrentThread();
       // ... method body
   }
 }
 

재입 가능한 락이 재입 불가능한 방법으로 확실히 사용되도록(듯이) 하는 경우에도, 이것을 사용할 수 있습니다. 다음에 예를 나타냅니다.

 class X {
   ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
       assert ! lock.isHeldByCurrentThread();
       lock.lock();
       try {
           // ... method body
       } finally {
           lock.unlock();
       }
   }
 }
 

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

isLocked

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

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

isFair

public final boolean isFair()
이 락으로 공평성이 true 로 설정되어 있는 경우는 true 를 돌려줍니다.

반환값:
이 락으로 공평성이 true 로 설정되어 있는 경우는 true

getOwner

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

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

hasQueuedThreads

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

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

hasQueuedThread

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

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

getQueueLength

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

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

getQueuedThreads

protected Collection <Thread > getQueuedThreads()
이 락의 취득을 대기하고 있는 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()
이 락 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다. 상태는 괄호로 둘러싸여 캐릭터 라인 "Unlocked" 또는 캐릭터 라인 "Locked by" 에 이어, 소유하는 thread의이름이 포함됩니다.

오버라이드(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 도 참조해 주세요.