Share via


AbstractQueuedSynchronizer 클래스

정의

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

[Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)]
public abstract class AbstractQueuedSynchronizer : Java.Util.Concurrent.Locks.AbstractOwnableSynchronizer, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)>]
type AbstractQueuedSynchronizer = class
    inherit AbstractOwnableSynchronizer
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
상속
AbstractQueuedSynchronizer
특성
구현

설명

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다. 이 클래스는 상태를 나타내는 단일 원자성 int 값에 의존하는 대부분의 동기화 장치에 유용한 기초가 되도록 설계되었습니다. 서브클래스는 이 상태를 변경하는 보호된 메서드를 정의해야 하며, 이 개체를 획득하거나 해제하는 측면에서 해당 상태가 의미하는 바를 정의해야 합니다. 이러한 경우 이 클래스의 다른 메서드는 모든 큐 및 차단 메커니즘을 수행합니다. 서브클래스는 다른 상태 필드를 유지할 수 있지만, 메서드 #setState#getState를 사용하여 조작된 원자성 업데이트 int 값만 동기화와 #compareAndSetState 관련하여 추적됩니다.

서브클래스는 바깥쪽 클래스의 동기화 속성을 구현하는 데 사용되는 공용이 아닌 내부 도우미 클래스로 정의되어야 합니다. 클래스 AbstractQueuedSynchronizer 는 동기화 인터페이스를 구현하지 않습니다. 대신 구체적인 잠금 및 관련 동기화기에서 적절하게 호출하여 공용 메서드를 구현할 수 있는 와 같은 #acquireInterruptibly 메서드를 정의합니다.

이 클래스는 기본 <em 배타<적/em 모드와 em>공유</em>> 모드를 <>모두 지원합니다. 배타적 모드에서 획득하는 경우 다른 스레드에서 시도한 획득은 성공할 수 없습니다. 여러 스레드에서 공유 모드를 획득하면 성공할 수 있습니다(하지만 필요하지는 않음). 이 클래스는 따옴표로 &않습니다.&이해; 공유 모드 획득이 성공하면 다음 대기 스레드(있는 경우)도 획득할 수 있는지 여부를 결정해야 한다는 기계적 의미를 제외하고는 이러한 차이점이 있습니다. 다른 모드에서 대기 중인 스레드는 동일한 FIFO 큐를 공유합니다. 일반적으로 구현 서브클래스는 이러한 모드 중 하나만 지원하지만 둘 다 예를 들어 에서 ReadWriteLock사용할 수 있습니다. 배타적 또는 공유 모드만 지원하는 서브클래스는 사용되지 않는 모드를 지원하는 메서드를 정의할 필요가 없습니다.

이 클래스는 전용 모드를 지원하는 서브클래스가 구현으로 Condition 사용할 수 있는 중첩 ConditionObject 클래스를 정의합니다. 이 메서드 #isHeldExclusively 는 동기화가 현재 스레드와 관련하여 독점적으로 유지되는지 여부를 보고하고, 현재 #getState 값으로 호출된 메서드 #release 는 이 개체를 완전히 해제하고#acquire, 이 저장된 상태 값을 감안할 때 이 개체를 이전에 획득한 상태로 복원합니다. AbstractQueuedSynchronizer 그렇지 않으면 메서드가 이러한 조건을 만들지 않으므로 이 제약 조건을 충족할 수 없는 경우 사용하지 마세요. 의 ConditionObject 동작은 물론 동기화 장치 구현의 의미 체계에 따라 달라집니다.

이 클래스는 내부 큐에 대한 검사, 계측 및 모니터링 방법과 조건 개체에 대한 유사한 메서드를 제공합니다. 동기화 메커니즘에 대해 를 사용하여 AbstractQueuedSynchronizer 원하는 대로 클래스로 내보낼 수 있습니다.

이 클래스의 직렬화는 기본 원자성 정수 유지 상태만 저장하므로 역직렬화된 개체에는 빈 스레드 큐가 있습니다. 직렬화가 필요한 일반적인 서브클래스는 역직렬화 시 이를 알려진 초기 상태로 복원하는 메서드를 정의 readObject 합니다.

<h2>사용량</h2>

이 클래스를 동기화 프로그램의 기초로 사용하려면 , #setState 및/또는 #compareAndSetState를 사용하여 #getState동기화 상태를 검사 및/또는 수정하여 해당하는 경우 다음 메서드를 다시 정의합니다.

<ul><li><#tryAcquireli#tryRelease><li><#tryAcquireSharedli#tryReleaseShared<><>#isHeldExclusively/ul>

이러한 각 메서드는 기본적으로 을 throw합니다 UnsupportedOperationException. 이러한 메서드의 구현은 내부적으로 스레드로부터 안전해야 하며 일반적으로 짧고 차단되지 않아야 합니다. 이러한 메서드를 정의하는 것은 이 클래스를 <사용하는 em>only</em> 지원 수단입니다. 다른 모든 메서드는 독립적으로 변경할 수 없으므로 선언 final 됩니다.

단독 동기화 장치를 소유하는 스레드를 추적하는 데 유용한 의 상속된 메서드 AbstractOwnableSynchronizer 를 찾을 수도 있습니다. 이를 통해 사용자가 잠금을 보유하는 스레드를 결정하는 데 도움이 되는 모니터링 및 진단 도구를 사용할 수 있습니다.

이 클래스는 내부 FIFO 큐를 기반으로 하지만 FIFO 획득 정책을 자동으로 적용하지는 않습니다. 배타적 동기화의 핵심은 다음과 같은 형식을 사용합니다.

<em>Acquire:</em>
                while (!tryAcquire(arg)) {
<em>enqueue thread if it is not already queued</em>;
<em>possibly block current thread</em>;
                }

<em>Release:</em>
                if (tryRelease(arg))
<em>unblock the first queued thread</em>;

(공유 모드는 유사하지만 연속 신호를 포함할 수 있습니다.)

<p id="barging">인수 체크 인은 큐에 넣기 전에 호출되므로 새로 획득한 스레드는 차단되고 큐에 대기된 다른 스레드보다 먼저 barge</em>을 포함>할 수 있습니다<. 그러나 원하는 경우 하나 이상의 검사 방법을 내부적으로 호출하여 표시줄을 정의 tryAcquire 및/또는 tryAcquireShared 사용하지 않도록 설정하여 em>fair</em> FIFO 취득 주문을 제공할 <수 있습니다. 특히 가장 공정한 동기화 장치는 (공정 동기화기에서 사용하도록 특별히 설계된 메서드)가 를 반환하는 경우 를 반환 false 하도록 정의 tryAcquire 할 수 있습니다true.#hasQueuedPredecessors 다른 변형이 가능합니다.

처리량 및 확장성은 일반적으로 기본 막대(em greedy</em, <em>renouncement</em> 및 <em>convoy-avoidance</em>>라고도 함<) 전략에서 가장 높습니다.> 이는 공정하거나 기아가 없는 것으로 보장되지는 않지만, 나중에 큐에 대기 중인 스레드 전에 이전 대기 중인 스레드를 다시 연결할 수 있으며, 각 다시 연결은 들어오는 스레드에 대해 성공할 수 있는 편견 없는 기회가 있습니다. 또한 인수는 따옴표로 &않습니다. 스핀&따옴표; 일반적으로 차단하기 전에 다른 계산과 산재된 의 여러 호출 tryAcquire 을 수행할 수 있습니다. 이렇게 하면 배타적 동기화가 잠깐만 유지되는 경우 대부분의 책임 없이 스핀의 이점을 대부분 얻을 수 있습니다. 원하는 경우 호출 앞의 호출을 통해 이를 보강하여 "빠른 경로" 검사를 통해 메서드를 획득하거나, 미리 확인 #hasContended 및/또는 #hasQueuedThreads 동기화 장치가 경합되지 않을 경우에만 이를 수행할 수 있습니다.

이 클래스는 상태, 획득 및 해제 매개 변수 및 내부 FIFO 대기 큐에 의존할 수 있는 동기화 장치에 대한 사용 범위를 특수화하여 동기화를 int 위한 효율적이고 확장 가능한 기반을 부분적으로 제공합니다. 이것으로 충분하지 않은 경우 클래스, 사용자 지정 java.util.Queue 클래스 및 LockSupport 차단 지원을 사용하여 java.util.concurrent.atomic atomic 하위 수준에서 동기화기를 빌드할 수 있습니다.

<h2>사용 예제</h2>

다음은 값 0을 사용하여 잠금 해제된 상태를 나타내는 재진입되지 않은 상호 제외 잠금 클래스와 잠긴 상태를 나타내는 클래스입니다. 재진입하지 않는 잠금은 현재 소유자 스레드의 기록을 엄격하게 요구하지는 않지만, 이 클래스는 사용량을 모니터링하기 쉽게 하기 위해 어쨌든 그렇게 합니다. 또한 조건을 지원하고 일부 계측 방법을 노출합니다.

{@code
            class Mutex implements Lock, java.io.Serializable {

              // Our internal helper class
              private static class Sync extends AbstractQueuedSynchronizer {
                // Acquires the lock if state is zero
                public boolean tryAcquire(int acquires) {
                  assert acquires == 1; // Otherwise unused
                  if (compareAndSetState(0, 1)) {
                    setExclusiveOwnerThread(Thread.currentThread());
                    return true;
                  }
                  return false;
                }

                // Releases the lock by setting state to zero
                protected boolean tryRelease(int releases) {
                  assert releases == 1; // Otherwise unused
                  if (!isHeldExclusively())
                    throw new IllegalMonitorStateException();
                  setExclusiveOwnerThread(null);
                  setState(0);
                  return true;
                }

                // Reports whether in locked state
                public boolean isLocked() {
                  return getState() != 0;
                }

                public boolean isHeldExclusively() {
                  // a data race, but safe due to out-of-thin-air guarantees
                  return getExclusiveOwnerThread() == Thread.currentThread();
                }

                // Provides a Condition
                public Condition newCondition() {
                  return new ConditionObject();
                }

                // Deserializes properly
                private void readObject(ObjectInputStream s)
                    throws IOException, ClassNotFoundException {
                  s.defaultReadObject();
                  setState(0); // reset to unlocked state
                }
              }

              // The sync object does all the hard work. We just forward to it.
              private final Sync sync = new Sync();

              public void lock()              { sync.acquire(1); }
              public boolean tryLock()        { return sync.tryAcquire(1); }
              public void unlock()            { sync.release(1); }
              public Condition newCondition() { return sync.newCondition(); }
              public boolean isLocked()       { return sync.isLocked(); }
              public boolean isHeldByCurrentThread() {
                return sync.isHeldExclusively();
              }
              public boolean hasQueuedThreads() {
                return sync.hasQueuedThreads();
              }
              public void lockInterruptibly() throws InterruptedException {
                sync.acquireInterruptibly(1);
              }
              public boolean tryLock(long timeout, TimeUnit unit)
                  throws InterruptedException {
                return sync.tryAcquireNanos(1, unit.toNanos(timeout));
              }
            }}

다음은 하나의 signal 래치만 실행해야 한다는 점을 제외하고 와 같은 java.util.concurrent.CountDownLatch CountDownLatch 래치 클래스입니다. 래치는 비독점적이므로 획득 및 해제 메서드를 shared 사용합니다.

{@code
            class BooleanLatch {

              private static class Sync extends AbstractQueuedSynchronizer {
                boolean isSignalled() { return getState() != 0; }

                protected int tryAcquireShared(int ignore) {
                  return isSignalled() ? 1 : -1;
                }

                protected boolean tryReleaseShared(int ignore) {
                  setState(1);
                  return true;
                }
              }

              private final Sync sync = new Sync();
              public boolean isSignalled() { return sync.isSignalled(); }
              public void signal()         { sync.releaseShared(1); }
              public void await() throws InterruptedException {
                sync.acquireSharedInterruptibly(1);
              }
            }}

1.5에 추가되었습니다.

에 대한 Java 설명서입니다 java.util.concurrent.locks.AbstractQueuedSynchronizer.

이 페이지의 일부는 만들고 공유하며 에 설명된 용어에 따라 사용되는 작업을 기반으로 수정됩니다.

생성자

AbstractQueuedSynchronizer()

초기 동기화 상태가 0인 새 AbstractQueuedSynchronizer instance 만듭니다.

AbstractQueuedSynchronizer(IntPtr, JniHandleOwnership)

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

속성

Class

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

(다음에서 상속됨 Object)
ExclusiveOwnerThread

에서 마지막으로 설정한 스레드를 setExclusiveOwnerThread반환하거나 null , 설정하지 않으면 를 반환합니다. -또는- 현재 단독 액세스를 소유하는 스레드를 설정합니다.

(다음에서 상속됨 AbstractOwnableSynchronizer)
ExclusiveQueuedThreads

단독 모드에서 획득을 기다리고 있을 수 있는 스레드가 포함된 컬렉션을 반환합니다.

FirstQueuedThread

큐에서 첫 번째(가장 오래 대기 중인) 스레드를 반환하거나 null 현재 큐에 대기 중인 스레드가 없는 경우 를 반환합니다.

Handle

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

(다음에서 상속됨 Object)
HasContended

스레드가 이 동기화 장치를 획득하기 위해 경합했는지 여부를 쿼리합니다. 즉, acquire 메서드가 차단된 경우 입니다.

HasQueuedPredecessors

스레드가 현재 스레드보다 오래 획득하기 위해 대기하고 있는지 여부를 쿼리합니다.

HasQueuedThreads

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

IsHeldExclusively

동기화가 현재(호출) 스레드와 관련하여 독점적으로 유지되는 경우 를 반환 true 합니다.

JniIdentityHashCode

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
JniPeerMembers

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

PeerReference

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
QueuedThreads

획득 대기 중인 스레드가 포함된 컬렉션을 반환합니다.

QueueLength

획득 대기 중인 스레드 수의 추정치를 반환합니다.

SharedQueuedThreads

공유 모드에서 획득을 기다리고 있을 수 있는 스레드가 포함된 컬렉션을 반환합니다.

State

동기화 상태의 현재 값을 반환합니다. -또는- 동기화 상태의 값을 설정합니다.

ThresholdClass

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

ThresholdType

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

메서드

Acquire(Int32)

인터럽트 무시 전용 모드에서 를 획득합니다.

AcquireInterruptibly(Int32)

배타적 모드에서 를 획득하고 중단된 경우 중단합니다.

AcquireShared(Int32)

인터럽트는 무시하고 공유 모드에서 를 획득합니다.

AcquireSharedInterruptibly(Int32)

공유 모드에서 를 획득하고 중단된 경우 중단합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
CompareAndSetState(Int32, Int32)

현재 상태 값이 예상 값과 같으면 동기화 상태를 지정된 업데이트된 값으로 원자성으로 설정합니다.

Dispose()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
GetHashCode()

개체의 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
GetWaitingThreads(AbstractQueuedSynchronizer+ConditionObject)

이 동기화 장치와 연결된 지정된 조건에서 대기할 수 있는 스레드가 포함된 컬렉션을 반환합니다.

GetWaitQueueLength(AbstractQueuedSynchronizer+ConditionObject)

이 동기화 장치와 연결된 지정된 조건에서 대기 중인 스레드 수의 추정치를 반환합니다.

HasWaiters(AbstractQueuedSynchronizer+ConditionObject)

스레드가 이 동기화 장치와 연결된 지정된 조건에서 대기하고 있는지 여부를 쿼리합니다.

IsQueued(Thread)

지정된 스레드가 현재 큐에 대기 중인 경우 true를 반환합니다.

JavaFinalize()

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
Owns(AbstractQueuedSynchronizer+ConditionObject)

지정된 ConditionObject에서 이 동기화 장치를 잠금으로 사용하는지 여부를 쿼리합니다.

Release(Int32)

배타적 모드로 릴리스됩니다.

ReleaseShared(Int32)

공유 모드의 릴리스입니다.

SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
ToArray<T>()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
TryAcquire(Int32)

배타적 모드에서 획득을 시도합니다.

TryAcquireNanos(Int32, Int64)

배타적 모드에서 획득을 시도하고, 중단되면 중단하고, 지정된 시간 제한이 경과하면 실패합니다.

TryAcquireShared(Int32)

공유 모드에서 획득을 시도합니다.

TryAcquireSharedNanos(Int32, Int64)

공유 모드에서 획득을 시도하고, 중단되면 중단하고, 지정된 시간 제한이 경과하면 실패합니다.

TryRelease(Int32)

단독 모드에서 릴리스를 반영하도록 상태를 설정하려고 시도합니다.

TryReleaseShared(Int32)

공유 모드에서 릴리스를 반영하도록 상태를 설정하려고 시도합니다.

UnregisterFromRuntime()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
Wait()

현재 스레드가 각성될 때까지 대기하도록 합니다. 일반적으로 <알림을<> 받>거나<<> 중단/em>합니다.

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

IJavaPeerable.Disposed()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.DisposeUnlessReferenced()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.Finalized()

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

GetJniTypeName(IJavaPeerable)

FIFO(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다.

적용 대상