Semaphore 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
카운팅 세마포입니다.
[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)>]
type Semaphore = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 상속
- 특성
- 구현
설명
카운팅 세마포입니다. 개념적으로 세마포는 일련의 허가를 유지합니다. 허가가 제공될 때까지 필요한 경우 각 #acquire
블록을 차단한 다음 사용합니다. 각각 #release
은 허가를 추가하여 차단 획득자를 해제할 수 있습니다. 그러나 실제 허용 개체는 사용되지 않습니다. 는 Semaphore
사용 가능한 수의 개수를 유지하고 그에 따라 작동합니다.
세마포는 일부(물리적 또는 논리적) 리소스에 액세스할 수 있는 것보다 스레드 수를 제한하는 데 자주 사용됩니다. 예를 들어 세마포를 사용하여 항목 풀에 대한 액세스를 제어하는 클래스는 다음과 같습니다.
{@code
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;
}
}}
항목을 가져오기 전에 각 스레드는 세마포에서 허가를 받아야 하므로 항목을 사용할 수 있습니다. 스레드가 항목을 완료하면 풀로 다시 반환되고 허가가 세마포로 반환되어 다른 스레드가 해당 항목을 획득할 수 있습니다. 항목이 풀로 반환되지 않도록 가 호출될 때 #acquire
동기화 잠금이 유지되지 않습니다. 세마포는 풀 자체의 일관성을 유지하는 데 필요한 동기화와 별도로 풀에 대한 액세스를 제한하는 데 필요한 동기화를 캡슐화합니다.
1로 초기화된 세마포이며, 최대 하나의 허가만 사용할 수 있도록 사용되는 세마포는 상호 배제 잠금으로 사용될 수 있습니다. 이는 사용 가능한 허가 1개 또는 사용 가능한 허가 0개라는 두 가지 상태만 있기 때문에 일반적으로 em>이진 세마포</em>이라고 <합니다. 이러한 방식으로 사용되는 경우 이진 세마포에는 &따옴표로 묶은 속성(많은 java.util.concurrent.locks.Lock
구현과 달리)이 있습니다. 잠금&따옴표; 는 소유자 이외의 스레드에서 해제할 수 있습니다(세마포에는 소유권 개념이 없으므로). 교착 상태 복구와 같은 일부 특수 컨텍스트에서 유용할 수 있습니다.
이 클래스의 생성자는 선택적으로 em>fairness</em 매개 변수를 <> 허용합니다. false로 설정하면 이 클래스는 스레드가 허용을 획득하는 순서를 보장하지 않습니다. 특히, <em>barging</em> 이 허용됩니다. 즉, 스레드 호출 #acquire
은 대기 중인 스레드보다 먼저 허용을 할당할 수 있습니다. 논리적으로 새 스레드는 대기 중인 스레드의 큐의 헤드에 배치됩니다. 공정성이 true로 설정되면 세마포는 메서드를 호출하는 스레드가 해당 메서드의 #acquire() acquire
호출이 처리된 순서대로 허용을 얻기 위해 선택되도록 보장합니다(첫 번째 실행; FIFO). FIFO 순서 지정은 반드시 이러한 메서드 내의 특정 내부 실행 지점에 적용됩니다. 따라서 한 스레드가 다른 스레드 앞에서 호출 acquire
할 수 있지만 다른 스레드와 마찬가지로 메서드에서 반환될 때 순서 지정 지점에 도달할 수 있습니다. 또한 시간 #tryAcquire() tryAcquire
없음 메서드는 공정성 설정을 존중하지 않지만 사용 가능한 모든 허가를 받게 됩니다.
일반적으로 리소스 액세스를 제어하는 데 사용되는 세마포는 공평하게 초기화되어 스레드가 리소스에 액세스하지 못하도록 해야 합니다. 다른 종류의 동기화 제어에 세마포를 사용하는 경우 공정하지 않은 순서의 처리량 이점은 종종 공정성 고려 사항보다 큽니다.
이 클래스는 한 번에 여러 허용에 #acquire(int) acquire
#release(int) release
대한 편리한 메서드도 제공합니다. 이러한 메서드는 일반적으로 루프보다 효율적이고 효과적입니다. 그러나 기본 설정 순서는 설정하지 않습니다. 예를 들어 스레드 A가 를 호출 s.acquire(3
하고 스레드 B가 를 호출 s.acquire(2)
하고 두 개의 허용을 사용할 수 있게 되면 인수가 먼저 제공되고 세마포 s
가 공정 모드가 아닌 한 스레드 B가 이를 얻을 것이라는 보장은 없습니다.
메모리 일관성 효과: "릴리스" 메서드를 호출하기 전 스레드의 작업(예: 다른 스레드와 같은 release()
<>성공적인 "획득" 메서드 acquire()
에 따라 수행</이전/i> 작업).
1.5에 추가되었습니다.
에 대한 Java 설명서입니다 java.util.concurrent.Semaphore
.
이 페이지의 일부는 만들고 공유하며 에 설명된 조건에 따라 사용되는 작업을 기반으로 수정됩니다.
생성자
Semaphore(Int32) |
|
Semaphore(Int32, Boolean) |
|
Semaphore(IntPtr, JniHandleOwnership) |
JNI 개체의 관리형 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다. |
속성
Class |
이 |
Handle |
기본 Android instance 대한 핸들입니다. (다음에서 상속됨 Object) |
HasQueuedThreads |
스레드가 획득을 기다리고 있는지 여부를 쿼리합니다. |
IsFair |
이 세마포에 공정성이 true로 설정된 경우 를 반환 |
JniIdentityHashCode |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
JniPeerMembers |
카운팅 세마포입니다. |
PeerReference |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
QueuedThreads |
획득을 기다리고 있을 수 있는 스레드가 포함된 컬렉션을 반환합니다. |
QueueLength |
획득을 기다리는 스레드 수의 예상값을 반환합니다. |
ThresholdClass |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
ThresholdType |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
메서드
Acquire() |
이 세마포에서 허가를 획득하여 사용할 수 있거나 스레드가 Thread#인터럽트 중단될 때까지 차단합니다. |
Acquire(Int32) |
이 세마포에서 지정된 허용 횟수를 획득하여 모든 것을 사용할 수 있거나 스레드가 스레드#인터럽트 중단될 때까지 차단합니다. |
AcquireUninterruptibly() |
이 세마포에서 허가를 획득하여 사용할 수 있게 될 때까지 차단합니다. |
AcquireUninterruptibly(Int32) |
이 세마포에서 지정된 허용 횟수를 획득하여 모두 사용할 수 있게 될 때까지 차단합니다. |
AvailablePermits() |
이 세마포에서 사용할 수 있는 현재 허가 수를 반환합니다. |
Clone() |
이 개체의 복사본을 만들고 반환합니다. (다음에서 상속됨 Object) |
Dispose() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
Dispose(Boolean) |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
DrainPermits() |
즉시 사용할 수 있는 모든 허용을 획득하고 반환하거나, 음수 허용을 사용할 수 있는 경우 해제합니다. |
Equals(Object) |
다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다. (다음에서 상속됨 Object) |
GetHashCode() |
개체의 해시 코드 값을 반환합니다. (다음에서 상속됨 Object) |
JavaFinalize() |
가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다. (다음에서 상속됨 Object) |
Notify() |
이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다. (다음에서 상속됨 Object) |
NotifyAll() |
이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다. (다음에서 상속됨 Object) |
ReducePermits(Int32) |
표시된 감소로 사용 가능한 허가 수를 줄입니다. |
Release() |
허가를 해제하고 세마포로 반환합니다. |
Release(Int32) |
지정된 허용 횟수를 해제하여 세마포로 반환합니다. |
SetHandle(IntPtr, JniHandleOwnership) |
Handle 속성을 설정합니다. (다음에서 상속됨 Object) |
ToArray<T>() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
ToString() |
개체의 문자열 표현을 반환합니다. (다음에서 상속됨 Object) |
TryAcquire() |
호출 시 사용 가능한 경우에만 이 세마포에서 허가를 획득합니다. |
TryAcquire(Int32) |
호출 시 모두 사용할 수 있는 경우에만 이 세마포에서 지정된 허용 횟수를 획득합니다. |
TryAcquire(Int32, Int64, TimeUnit) |
지정된 대기 시간 내에 모두 사용할 수 있고 현재 스레드가 Thread#인터럽트 중단되지 않은 경우 이 세마포에서 지정된 수의 허용을 획득합니다. |
TryAcquire(Int64, TimeUnit) |
지정된 대기 시간 내에 사용 가능해지고 현재 스레드가 스레드#인터럽트 중단되지 않은 경우 이 세마포에서 허가를 획득합니다. |
UnregisterFromRuntime() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
Wait() |
현재 스레드가 깨어날 때까지 대기하게 합니다( 일반적으로 <알림을 받><거나 <>중단/>em>)합니다<. (다음에서 상속됨 Object) |
Wait(Int64) |
현재 스레드가 깨어날 때까지 대기하게 합니다. 일반적으로 <>알림을 받<거나 <중단</>내보내>>거나 일정량의 실시간이 경과할 때까지 대기합니다. (다음에서 상속됨 Object) |
Wait(Int64, Int32) |
현재 스레드가 깨어날 때까지 대기하게 합니다. 일반적으로 <>알림을 받<거나 <중단</>내보내>>거나 일정량의 실시간이 경과할 때까지 대기합니다. (다음에서 상속됨 Object) |
명시적 인터페이스 구현
IJavaPeerable.Disposed() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.Finalized() |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.JniManagedPeerState |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
카운팅 세마포입니다. (다음에서 상속됨 Object) |
확장 메서드
JavaCast<TResult>(IJavaObject) |
Android 런타임 확인 형식 변환을 수행합니다. |
JavaCast<TResult>(IJavaObject) |
카운팅 세마포입니다. |
GetJniTypeName(IJavaPeerable) |
카운팅 세마포입니다. |