|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.concurrent.Semaphore
public class Semaphore
계수 세마포어-입니다. 개념적으로, 세마포어-는 허가(permit)세트를 유지합니다. 각 acquire()
는 허가가 이용 가능하게 될 때까지 필요에 따라서 블록 해, 이용 가능하게 되면(자) 허가(permit)를 가져옵니다. 각 release()
는 허가(permit)를 추가해, 경우에 따라서는 블록 하고 있는 취득측을 해제합니다. 다만, 실제의 허가(permit) 객체는 사용되지 않습니다. Semaphore
에서는, 이용 가능한 수를 세어, 거기에 응한 처리를 실시할 뿐입니다.
세마포어-는, 물리적 또는 논리적인 일부의 자원에 액세스 가능한 thread수를 제한하기 위해서 자주(잘) 사용됩니다. 예를 들어, 다음의 클래스에서는, 세마포어-를 사용해 항목의 풀에의 액세스를 제어합니다.
class Pool { private static final int MAX_AVAILABLE = 100; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } public void putItem(Object x) { if (markAsUnused(x)) available.release(); } // Not a particularly efficient data structure; just for demo protected Object[] items = ... whatever kinds of items being managed protected boolean[] used = new boolean[MAX_AVAILABLE]; protected synchronized Object getNextAvailableItem() { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (! used[i]) { used[i] = true; return items[i]; } } return null; // not reached } protected synchronized boolean markAsUnused(Object item) { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]) { if (used[i]) { used[i] = false; return true; } else return false; } } return false; } }
항목을 취득하기 전에, 각 thread는 세마포어-로부터, 항목이 사용 가능한 것을 보증하는 허가(permit)를 취득할 필요가 있습니다. 항목의 처리가 완료하면(자) thread는 풀로 돌아가, 허가(permit)가 세마포어-에 돌려주어져 다른 thread가 그 항목을 취득할 수 있게 됩니다. acquire()
의 호출시에 동기 락은 보관 유지되지 않습니다. 이것은 동기 락에 의해, 항목을 풀에 돌려줄 수가 없게 되기 (위해)때문에입니다. 세마포어-는, 풀에의 액세스를 제한할 필요가 있는 동기를, 풀 자체의 일관성을 유지하기 위해서 필요한 동기부터는 분리해 캡슐화합니다.
값을 1 에 초기화된 세마포어-는, 이용할 수 있는 허가(permit)가 최대로 1 개인 세마포어-로서 사용되기 (위해)때문에, 상호 배타 락으로서 이용할 수 있습니다. 이것은 일반적으로는 「2 진형세마포어-」(이)라고 불립니다. 이용 가능한 허가(permit)가 1 개나 0 개인가의 2 개 상태 밖에 없기 때문입니다. 이와 같이 사용되는 경우, 많은 Lock
구현과는 달라, 2 진형세마포어-는, 「락」을 소유자 이외의 thread로 해제할 수 있다고 하는 특성을 가집니다 (세마포어-에는 소유권의 개념이 없기 때문에). 이것은, 데드락의 회복과 같이 특수한 문맥으로 편리합니다.
이 클래스의 생성자 은, 옵션의 「공평성」파라미터를 받아들입니다. false 로 설정하면(자), 이 클래스는 thread가 허가(permit)를 취득하는 순서에 대해 보증하지 않습니다. 특히, 「인터럽트」(barging)이 허가되고 있습니다. 즉,acquire()
를 호출하는 thread에, 대기하고 있던 thread보다 먼저 허가(permit)를 할당하는 것이 가능합니다. 논리적이게는, 새로운 thread가 대기중의 thread의 큐의 선두에 배치되게 됩니다. 공평성이 true 로 설정되면(자), 세마포어-는,acquire
메소드를 호출하는 thread가, 호출이 처리된 순서 (선입처 내, FIFO)로 허가(permit)를 취득하도록(듯이) 선택되는 것을 보증합니다. FIFO 순서부는, 필연적으로 이러한 메소드내의 특정의 내부 실행 포인트에 적용됩니다. 그 때문에, 어느 thread가 다른 thread보다 먼저 acquire
를 호출하지만, 그 thread보다 나중에 순서부 포인트에 이르는 경우가 있습니다. 또, 메소드로부터의 복귀시에도 같은 일이 일어날 가능성이 있습니다. 또, 시간 지정이 없는 tryAcquire
메소드는 공평성 설정을 존중하지 않고, 받아들이지 않습니다만, 이용 가능한 허가(permit)는 가져옵니다.
일반적으로, 자원 액세스를 제어하기 위해서 사용되는 세마포어-는, 자원에의 액세스를 할 수 없는 thread가 없게, 공평하게 초기화될 필요가 있습니다. 다른 종류의 동기 제어에 세마포어-를 사용하는 경우는, 공평성을 고려하는 것보다도 불공평한 순서부에 의한 throughput의 이점 쪽이 자주 중요하게 됩니다.
이 클래스에는, 동시에 복수의 허가(permit)를 취득
및 해제
하기 위한 편리한 메소드도 있습니다. 공평성을 true 로 설정하지 않고 이러한 메소드를 사용하면(자), 무기한으로 연기되는 위험이 늘어나는 것에 주의해 주세요.
메모리 무결성 효과:release()
등의 「해제」메소드를 호출하기 전의 thread내의 액션은, 다른 thread로 acquire()
등의 정상 종료한 「취득」메소드에 계속되는 액션보다「전에 발생」합니다.
생성자 의 개요 | |
---|---|
Semaphore (int permits)
지정된 수의 허가(permit)와 불공평한 공평성 설정을 사용해, Semaphore 를 작성합니다. |
|
Semaphore (int permits,
boolean fair)
지정된 수의 허가(permit)와 지정된 공평성 설정을 사용해, Semaphore 를 작성합니다. |
메소드의 개요 | |
---|---|
void |
acquire ()
이 세마포어-로부터 허가(permit)를 가져옵니다. |
void |
acquire (int permits)
이 세마포어-로부터 지정된 수의 허가(permit)를 가져옵니다. |
void |
acquireUninterruptibly ()
이 세마포어-로부터 허가(permit)를 가져옵니다. |
void |
acquireUninterruptibly (int permits)
이 세마포어-로부터 지정된 수의 허가(permit)를 가져옵니다. |
int |
availablePermits ()
이 세마포어-로 현재 이용 가능한 허가(permit)의 수를 돌려줍니다. |
int |
drainPermits ()
곧바로 이용 가능한 모든 허가(permit)를 취득해 돌려줍니다. |
protected Collection <Thread > |
getQueuedThreads ()
허가(permit)의 취득을 대기하고 있는 thread를 포함한 컬렉션을 돌려줍니다. |
int |
getQueueLength ()
허가(permit)의 취득을 대기하고 있는 thread의 추정수를 돌려줍니다. |
boolean |
hasQueuedThreads ()
허가(permit)의 취득을 대기중의 thread가 존재할지 어떨지를 조회합니다. |
boolean |
isFair ()
이 세마포어-로 공평성이 true 로 설정되어 있는 경우는 true 를 돌려줍니다. |
protected void |
reducePermits (int reduction)
지정된 reduction 의 수만큼 이용 가능한 허가(permit)의 수를 줄입니다. |
void |
release ()
허가(permit)를 해제해, 세마포어-에 되돌립니다. |
void |
release (int permits)
지정된 수의 허가(permit)를 해제해, 세마포어-에 되돌립니다. |
String |
toString ()
세마포어- 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다. |
boolean |
tryAcquire ()
허가(permit)가 호출해 때에 이용 가능한 경우에 한정해, 이 세마포어-로부터 허가(permit)를 가져옵니다. |
boolean |
tryAcquire (int permits)
지정된 수의 허가(permit)가 호출해 때에 이용 가능한 경우에 한정해, 그 모든 허가(permit)를 가져옵니다. |
boolean |
tryAcquire (int permits,
long timeout,
TimeUnit unit)
지정된 대기 시간내에 지정된 수의 허가(permit)가 이용 가능하고, 현재의 thread로 인터럽트 가 발생하고 있지 않는 경우에, 이 세마포어-로부터 지정된 수의 허가(permit)를 가져옵니다. |
boolean |
tryAcquire (long timeout,
TimeUnit unit)
지정된 대기 시간내에 허가(permit)가 이용 가능하게 되어, 현재의 thread로 인터럽트 가 발생하고 있지 않는 경우에, 이 세마포어-로부터 허가(permit)를 가져옵니다. |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
clone , equals , finalize , getClass , hashCode , notify , notifyAll , wait , wait , wait |
생성자 의 상세 |
---|
public Semaphore(int permits)
Semaphore
를 작성합니다.
permits
- 이용 가능한 허가(permit)의 초기의 수.
이 값은 부로 하는 일도 가능해, 그 경우는 취득 메소드가 허가를 받기 전에 해제이 발생할 필요가 있다public Semaphore(int permits, boolean fair)
Semaphore
를 작성합니다.
permits
- 이용 가능한 허가(permit)의 초기의 수.
이 값은 부로 하는 일도 가능해, 그 경우는 취득 메소드가 허가를 받기 전에 해제이 발생할 필요가 있는fair
- 이 세마포어-가 경합시에 허가(permit)의 허가를 선입선출으로 보증하는 경우는 true
, 그렇지 않은 경우는 false
메소드의 상세 |
---|
public void acquire() throws InterruptedException
허가(permit)가 이용 가능한 경우는 허가(permit)를 취득하자 마자 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 1 개씩 줄어듭니다.
허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.
release()
메소드를 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 된다.
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
InterruptedException
- 현재의 thread로 인터럽트가 발생했을 경우public void acquireUninterruptibly()
허가(permit)가 이용 가능한 경우는 허가(permit)를 취득하자 마자 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 1 개씩 줄어듭니다.
허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다른 thread가 이 세마포어-에 대해서 release()
메소드를 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 될 때까지, 현재의 thread는 대기합니다.
허가(permit)의 대기중에 현재의 thread가 끼어들어 되면(자), 대기는 속행합니다만, thread에 허가(permit)를 할당할 수 있는 타이밍은, 인터럽트가 발생하지 않았던 경우에 허가(permit)를 받아야할 타이밍과는 다른 일이 있습니다. thread가 이 메소드로부터 복귀하면(자), 그 인터럽트 상태가 설정됩니다.
public boolean tryAcquire()
허가(permit)가 이용 가능한 경우는 허가(permit)를 취득해 값 true
로 곧바로 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 1 개씩 줄어듭니다.
허가(permit)가 이용 가능하지 않은 경우, 이 메소드는 값 false
로 곧바로 복귀합니다.
이 세마포어-가 공평 순서부 정책를 사용하도록(듯이) 설정되어 있는 경우에서도, 허가(permit)가 사용 가능하면, 다른 thread가 현재 대기하고 있을지 어떨지에 관계없이,tryAcquire()
의 호출로 곧바로 허가(permit)를 가져옵니다. 이 「인터럽트」(barging) 동작에 의해 공평성이 없어진다고는 말할 수 있어 이것은 특정의 상황하로 유용합니다. 공평성 설정을 존중하는 경우는, 거의 등가인 tryAcquire(0, TimeUnit.SECONDS)
를 사용합니다 (이것도 인터럽트를 검출한다).
true
, 그렇지 않은 경우는 false
public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException
허가(permit)가 이용 가능한 경우는 허가(permit)를 취득해 값 true
로 곧바로 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 1 개씩 줄어듭니다.
허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.
release()
메소드를 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 된다.
허가(permit)가 취득되면(자),true
가 돌려주어집니다.
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
지정된 대기 시간이 경과하면(자), 값 false
가 돌려주어집니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.
timeout
- 허가(permit)의 최장 대기 시간unit
- timeout
인수의 시간 단위
true
, 허가(permit)가 취득되기 전에 대기 시간이 경과했을 경우는 false
InterruptedException
- 현재의 thread로 인터럽트가 발생했을 경우public void release()
허가(permit)를 해제하면(자), 이용 가능한 허가(permit)의 수가 1 개씩 증가합니다. 몇개의 thread가 허가(permit)를 취득하려고 시도하고 있는 경우는, 그 중의 1 개의 thread가 선택되어 해제된지 얼마 안된 허가(permit)가 주어집니다. 그 thread는, thread의 스케줄링에 관해서 (다시) 유효하게 됩니다.
허가(permit)를 해제하는 thread는,acquire()
의 호출로 그 허가(permit)를 취득하고 있을 필요는 없습니다. 세마포어-의 적절한 사용법은, 어플리케이션에서의 프로그래밍 규약으로 확립됩니다.
public void acquire(int permits) throws InterruptedException
지정된 수의 허가(permit)가 이용 가능한 경우는 허가(permit)를 취득하자 마자 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 지정된 수씩 줄어듭니다.
충분한 수의 허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.
release
메소드의 어느쪽이든을 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 되어, 이용 가능한 허가(permit)의 수가 이 요구를 채운다.
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다. 이 thread에 할당할 수 있을 것이었다 모든 허가(permit)는,release()
의 호출로 허가(permit)가 이용 가능하게 되었는지와 같이, 허가(permit)의 취득을 시도하는 다른 thread에 할당할 수 있습니다.
permits
- 취득하는 허가(permit)의 수
InterruptedException
- 현재의 thread로 인터럽트가 발생했을 경우
IllegalArgumentException
- permits
가 0 보다 작은 값의 경우public void acquireUninterruptibly(int permits)
지정된 수의 허가(permit)가 이용 가능한 경우는 허가(permit)를 취득하자 마자 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 지정된 수씩 줄어듭니다.
충분한 수의 허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다른 thread가 이 세마포어-에 대해서 release
메소드의 어느쪽이든을 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 되어, 이용 가능한 허가(permit)의 수가 이 요구를 채울 때까지, 현재의 thread는 대기합니다.
현재의 thread가 허가(permit)의 대기중에 끼어들어졌을
경우, 대기를 속행합니다. 큐내에서의 현재의 thread의 위치에는 영향 없습니다. thread가 이 메소드로부터 복귀하면(자), 그 인터럽트 상태가 설정됩니다.
permits
- 취득하는 허가(permit)의 수
IllegalArgumentException
- permits
가 0 보다 작은 값의 경우public boolean tryAcquire(int permits)
지정된 수의 허가(permit)가 이용 가능한 경우는 허가(permit)를 취득해 값 true
로 곧바로 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 지정된 수씩 줄어듭니다.
충분한 수의 허가(permit)가 이용 가능하지 않은 경우, 이 메소드는 값 false
로 곧바로 복귀해, 이용 가능한 허가(permit)의 수는 변화하지 않습니다.
이 세마포어-가 공평 순서부 정책를 사용하도록(듯이) 설정되어 있는 경우에서도, 허가(permit)가 사용 가능하면, 다른 thread가 현재 대기하고 있을지 어떨지에 관계없이,tryAcquire()
의 호출로 곧바로 허가(permit)를 가져옵니다. 이 「인터럽트」(barging) 동작에 의해 공평성이 없어진다고는 말할 수 있어 이것은 특정의 상황하로 유용합니다. 공평성 설정을 존중하는 경우는, 거의 등가인 tryAcquire(permits, 0, TimeUnit.SECONDS)
를 사용합니다 (이것도 인터럽트를 검출한다).
permits
- 취득하는 허가(permit)의 수
true
, 그렇지 않은 경우는 false
IllegalArgumentException
- permits
가 0 보다 작은 값의 경우public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException
지정된 수의 허가(permit)가 이용 가능한 경우는 허가(permit)를 취득해 값 true
로 곧바로 복귀하기 위해(때문에), 이용 가능한 허가(permit)의 수는 지정된 수씩 줄어듭니다.
충분한 수의 허가(permit)가 이용 가능하지 않은 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.
release
메소드의 어느쪽이든을 호출해, 현재의 thread가 다음에 허가(permit)를 할당할 수 있는 thread가 되어, 이용 가능한 허가(permit)의 수가 이 요구를 채운다.
허가(permit)가 취득되면(자),true
가 돌려주어집니다.
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다. 이 thread에 할당할 수 있을 것이었다 모든 허가(permit)는,release()
의 호출로 허가(permit)가 이용 가능하게 되었는지와 같이, 허가(permit)의 취득을 시도하는 다른 thread에 할당할 수 있습니다.
지정된 대기 시간이 경과하면(자), 값 false
가 돌려주어집니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다. 이 thread에 할당할 수 있을 것이었다 모든 허가(permit)는,release()
의 호출로 허가(permit)가 이용 가능하게 되었는지와 같이, 허가(permit)의 취득을 시도하는 다른 thread에 할당할 수 있습니다.
permits
- 취득하는 허가(permit)의 수timeout
- 허가(permit)의 최장 대기 시간unit
- timeout
인수의 시간 단위
true
, 모든 허가(permit)가 취득되기 전에 대기 시간이 경과했을 경우는 false
InterruptedException
- 현재의 thread로 인터럽트가 발생했을 경우
IllegalArgumentException
- permits
가 0 보다 작은 값의 경우public void release(int permits)
지정된 수의 허가(permit)를 해제하면(자), 이용 가능한 허가(permit)의 수가 그 만큼 증가합니다. 몇개의 thread가 허가(permit)를 취득하려고 시도하고 있는 경우, 그 중의 1 개의 thread가 선택되어, 해제된지 얼마 안된 허가(permit)가 주어집니다. 이용 가능한 허가(permit)의 수가 그 thread의 요구를 채우는 경우, 그 thread는 thread의 스케줄링에 관해서 (다시) 유효하게 됩니다. 그렇지 않은 경우, 충분한 허가(permit)가 이용 가능하게 될 때까지 thread는 대기합니다. 이 thread의 요구를 채운 뒤도 계속 허가(permit)가 이용 가능한 경우, 그러한 허가(permit)는 허가(permit)를 취득하려고 하고 있는 다른 thread에 할당할 수 있습니다.
허가(permit)를 해제하는 thread는,acquire
의 호출로 그 허가(permit)를 취득하고 있을 필요는 없습니다. 세마포어-의 적절한 사용법은, 어플리케이션에서의 프로그래밍 규약으로 확립됩니다.
permits
- 해제하는 허가(permit)의 수
IllegalArgumentException
- permits
가 0 보다 작은 값의 경우public int availablePermits()
일반적으로, 이 메소드는 디버그와 테스트의 경우에 사용합니다.
public int drainPermits()
protected void reducePermits(int reduction)
acquire
와 다릅니다.
reduction
- 삭제하는 허가(permit)의 수
IllegalArgumentException
- reduction
가 0 보다 작은 값의 경우public boolean isFair()
true
를 돌려줍니다.
true
public final boolean hasQueuedThreads()
true
public final int getQueueLength()
protected Collection <Thread > getQueuedThreads()
public String toString()
"Permits ="
에 이어 허가(permit)의 수가 포함됩니다.
Object
내의 toString
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.