AbstractQueuedSynchronizer 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
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
- 상속
- 특성
- 구현
설명
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><#tryAcquire
li#tryRelease
><li><#tryAcquireShared
li#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(IntPtr, JniHandleOwnership) |
JNI 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다. |
속성
Class |
이 |
ExclusiveOwnerThread |
에서 마지막으로 설정한 스레드를 |
ExclusiveQueuedThreads |
단독 모드에서 획득을 기다리고 있을 수 있는 스레드가 포함된 컬렉션을 반환합니다. |
FirstQueuedThread |
큐에서 첫 번째(가장 오래 대기 중인) 스레드를 반환하거나 |
Handle |
기본 Android instance 대한 핸들입니다. (다음에서 상속됨 Object) |
HasContended |
스레드가 이 동기화 장치를 획득하기 위해 경합했는지 여부를 쿼리합니다. 즉, acquire 메서드가 차단된 경우 입니다. |
HasQueuedPredecessors |
스레드가 현재 스레드보다 오래 획득하기 위해 대기하고 있는지 여부를 쿼리합니다. |
HasQueuedThreads |
스레드가 획득을 기다리고 있는지 여부를 쿼리합니다. |
IsHeldExclusively |
동기화가 현재(호출) 스레드와 관련하여 독점적으로 유지되는 경우 를 반환 |
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(선제출) 대기 큐를 사용하는 차단 잠금 및 관련 동기화기(세마포, 이벤트 등)를 구현하기 위한 프레임워크를 제공합니다. |