JavaTM Platform
Standard Ed. 6

java.util.concurrent.locks
클래스 LockSupport

java.lang.Object 
  상위를 확장 java.util.concurrent.locks.LockSupport


public class LockSupport
extends Object

락 및 다른 동기 클래스를 작성하기 위한 , 기본적인 thread 블록 프리미티브(primitive)입니다.

이 클래스는, 그것을 사용하는 각 thread와 허가(permit)를 (Semaphore 클래스라고 하는 의미로) 관련짓습니다. 허가(permit)가 이용 가능한 경우,park 의 호출은 즉시 복귀해, 프로세스내에서 허가(permit)를 소비합니다. 허가(permit)를 이용할 수 없는 경우는, 블록이 가능합니다. unpark 의 호출에 의해, 허가(permit)가 이용 가능하지 않은 경우는 이용 가능하게 됩니다. 다만, Semaphore 과는 달리, 허가(permit)에서는 누적은 실행되지 않고, 최대로 1 개 밖에 존재하지 않습니다.

parkunpark 메소드는, 비추천 메소드 Thread.suspendThread.resume 를 사용 불능으로 하는 것 같은 문제에 조우하지 않는 thread를 블록 및 블록 해제하는 효율적인 수단을 제공합니다. park 를 호출하는 thread 및 unpark 를 시도하는 다른 thread간의 경합은, 허가(permit)를 위해서(때문에) 활발한 상태를 유지합니다. 또, 호출측의 thread로 인터럽트가 발생해, 한편 타임 아웃 버젼이 지원되고 있는 경우,park 는 복귀합니다. park 메소드는, 「이유없이」언제 복귀하는 일도 가능하기 때문에, 일반적으로, 복귀시에 상태를 재체크하는 루프내에서 호출할 필요가 있습니다. 이 의미로,park 는 스핀에 시간을 낭비하는 것을 회피하는 최적화된 「Busy 웨이트」로서 기능합니다만, 효과를 발휘하기 위해서는 unpark 와 페어로 사용할 필요가 있습니다.

park 의 3 개의 형식의 각각에서도,blocker 객체 파라미터를 지원합니다. thread가 블록 되는 곳의 객체가 기록되기 (위해)때문에, 감시 및 진단 툴로 thread가 블록 된 이유를 특정할 수가 있는 (이러한 툴은,getBlocker(java.lang.Thread) 메소드를 사용해 브록카에 액세스 할 수 있습니다). 이 파라미터를 지정하지 않는 원의 형식은 아니고 이러한 형식을 사용하는 것을 강하게 추천합니다. 락 구현내의 blocker 로서 지정되는 일반적으로의 인수는,this 입니다.

이러한 메소드는, 고도의 동기 유틸리티의 작성용 툴로서 사용하도록(듯이) 설계되고 있어 그 자체에서는, 대부분의 동시 제어 어플리케이션에서는 유용하지는 않습니다. park 메소드는, 다음의 형식에서만 사용하도록(듯이) 설계되고 있습니다.

while (! canProceed()) { ... LockSupport.park(this); }
canProceed 도,park 의 호출전에 행해지는 그 외의 액션도, 락 또는 블록을 수반하지 않습니다. 각 thread에 관련지을 수 있는 허가(permit)는 1 개 뿐이기 (위해)때문에,park 를 중간적으로 사용하면(자), 의도한 효과와 간섭하는 일이 있습니다.

사용예. 다음에, 선입선출으로 재입 불가능한 락 클래스의 개략을 나타냅니다.

class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final Queue<Thread> waiters
     = new ConcurrentLinkedQueue<Thread>();

   public void lock() {
     boolean wasInterrupted = false;
     Thread current = Thread.currentThread();
     waiters.add(current);

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() ! = current ||
            ! locked.compareAndSet(false, true)) {
        LockSupport.park(this);
        if (Thread.interrupted()) // ignore interrupts while waiting
          wasInterrupted = true;
     }

     waiters.remove();
     if (wasInterrupted)          // reassert interrupt status on exit
        current.interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   }
 }


메소드의 개요
static Object getBlocker (Thread  t)
           아직 블록 해제되어 있지 않은 park 메소드의 최신의 호출로 지정된 브록카객체를 돌려줍니다.
static void park ()
          허가(permit)가 이용 가능하지 않은 경우, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.
static void park (Object  blocker)
          허가(permit)가 이용 가능하지 않은 경우, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.
static void parkNanos (long nanos)
          허가(permit)가 이용 가능한 경우를 제외해, 현재의 thread를, 지정된 대기 시간까지 thread 스케줄링에 관해서 무효로 합니다.
static void parkNanos (Object  blocker, long nanos)
          허가(permit)가 이용 가능한 경우를 제외해, 현재의 thread를, 지정된 대기 시간까지 thread 스케줄링에 관해서 무효로 합니다.
static void parkUntil (long deadline)
          허가(permit)가 이용 가능하지 않은 경우, 지정된 기한까지, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.
static void parkUntil (Object  blocker, long deadline)
          허가(permit)가 이용 가능하지 않은 경우, 지정된 기한까지, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.
static void unpark (Thread  thread)
          지정된 thread의 허가(permit)가 사용 가능하지 않은 경우에, 사용 가능하게 합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

메소드의 상세

unpark

public static void unpark(Thread  thread)
지정된 thread의 허가(permit)가 사용 가능하지 않은 경우에, 사용 가능하게 합니다. thread가 park 로 블록 되었을 경우에, 블록을 해제합니다. 그 이외의 경우, 다음의 park 의 호출이 블록 하지 않는 것이 보증됩니다. 지정된 thread가 기동하고 있지 않는 경우, 이 조작의 효과는 일절 보증되지 않습니다.

파라미터:
thread - unpark 를 실행하는 thread 또는 null. null 의 경우, 이 조작에는 아무 효과도 없다

park

public static void park(Object  blocker)
허가(permit)가 이용 가능하지 않은 경우, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, 복귀시의 thread의 인터럽트 상태등도 판정할 수 있습니다.

파라미터:
blocker - 이 thread의 park 를 실시하는 동기 객체
도입된 버젼:
1.6

parkNanos

public static void parkNanos(Object  blocker,
                             long nanos)
허가(permit)가 이용 가능한 경우를 제외해, 현재의 thread를, 지정된 대기 시간까지 thread 스케줄링에 관해서 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 4 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, thread의 인터럽트 상태나, 복귀시의 경과시간등도 판정할 수 있습니다.

파라미터:
blocker - 이 thread의 park 를 실시하는 동기 객체
nanos - 대기하는 최대 나노초수
도입된 버젼:
1.6

parkUntil

public static void parkUntil(Object  blocker,
                             long deadline)
허가(permit)가 이용 가능하지 않은 경우, 지정된 기한까지, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 4 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, thread의 인터럽트 상태나, 복귀시의 현재 시각등도 판정할 수 있습니다.

파라미터:
blocker - 이 thread의 park 를 실시하는 동기 객체
deadline - 대기용의, 신기원으로부터의 밀리 세컨드 단위의 절대 시간
도입된 버젼:
1.6

getBlocker

public static Object  getBlocker(Thread  t)
아직 블록 해제되어 있지 않은 park 메소드의 최신의 호출로 지정된 브록카객체를 돌려줍니다. 블록되어 있지 않은 경우는 null 를 돌려줍니다. 반환되는 값은, 순간적인 snapshot입니다. 그 때문에, thread는 다른 브록카객체로 블록 해제되고 있는 일도 블록 되고 있는 일도 있습니다.

반환값:
브록카
도입된 버젼:
1.6

park

public static void park()
허가(permit)가 이용 가능하지 않은 경우, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, 복귀시의 thread의 인터럽트 상태등도 판정할 수 있습니다.


parkNanos

public static void parkNanos(long nanos)
허가(permit)가 이용 가능한 경우를 제외해, 현재의 thread를, 지정된 대기 시간까지 thread 스케줄링에 관해서 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 4 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, thread의 인터럽트 상태나, 복귀시의 경과시간등도 판정할 수 있습니다.

파라미터:
nanos - 대기하는 최대 나노초수

parkUntil

public static void parkUntil(long deadline)
허가(permit)가 이용 가능하지 않은 경우, 지정된 기한까지, thread의 스케줄링에 관해서 현재의 thread를 무효로 합니다.

허가(permit)가 사용 가능한 경우, 이것은 소비되어 호출은 즉시 복귀합니다. 그 이외의 경우, 현재의 thread는, thread 스케줄링에 관해서 무효가 되어, 다음의 4 개중 한쪽이 일어날 때까지 대기합니다.

이 메소드는, 이러한 어떤 것이 메소드 복귀의 원인이 되었는가는 리포트하지 않습니다. 호출측은, thread의 첫회 park 의 원인이 된 상태를 재체크할 필요가 있습니다. 호출측은, thread의 인터럽트 상태나, 복귀시의 현재 시각등도 판정할 수 있습니다.

파라미터:
deadline - 대기용의, 신기원으로부터의 밀리 세컨드 단위의 절대 시간

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 도 참조해 주세요.