Share via


Semaphore 클래스

정의

카운팅 세마포입니다.

[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
상속
Semaphore
특성
구현

설명

카운팅 세마포입니다. 개념적으로 세마포는 일련의 허가를 유지합니다. 허가가 제공될 때까지 필요한 경우 각 #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 지정된 수의 허용 및 비계층 공정성 설정으로 을 만듭니다.

Semaphore(Int32, Boolean)

Semaphore 지정된 허용 횟수와 지정된 공정성 설정을 사용하여 을 만듭니다.

Semaphore(IntPtr, JniHandleOwnership)

JNI 개체의 관리형 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다.

속성

Class

Object의 런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
Handle

기본 Android instance 대한 핸들입니다.

(다음에서 상속됨 Object)
HasQueuedThreads

스레드가 획득을 기다리고 있는지 여부를 쿼리합니다.

IsFair

이 세마포에 공정성이 true로 설정된 경우 를 반환 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)

카운팅 세마포입니다.

적용 대상