Semaphore Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ein Zählsemaphor.
[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
- Vererbung
- Attribute
- Implementiert
Hinweise
Ein Zählsemaphor. Konzeptionell behält ein Semaphor eine Reihe von Genehmigungen bei. Jeder #acquire
blockiert bei Bedarf, bis eine Genehmigung vorliegt, und nimmt sie dann ein. Jede #release
fügt eine Genehmigung hinzu und gibt möglicherweise einen blockierenden Acquirer frei. Es werden jedoch keine tatsächlichen Genehmigungsobjekte verwendet; die Semaphore
nur die Anzahl der verfügbaren Zahlen hält und entsprechend handelt.
Semaphore werden häufig verwendet, um die Anzahl von Threads einzuschränken, als auf einige (physische oder logische) Ressourcen zugreifen können. Hier sehen Sie beispielsweise eine Klasse, die einen Semaphor verwendet, um den Zugriff auf einen Pool von Elementen zu steuern:
{@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;
}
}}
Vor dem Abrufen eines Elements muss jeder Thread eine Genehmigung vom Semaphor erwerben, um sicherzustellen, dass ein Element zur Verwendung verfügbar ist. Wenn der Thread mit dem Element fertig ist, wird es an den Pool zurückgegeben, und eine Genehmigung wird an den Semaphor zurückgegeben, sodass ein anderer Thread dieses Element abrufen kann. Beachten Sie, dass beim #acquire
Aufrufen keine Synchronisierungssperre gilt, da dadurch verhindert würde, dass ein Element an den Pool zurückgegeben wird. Das Semaphor kapselt die Synchronisierung, die erforderlich ist, um den Zugriff auf den Pool zu beschränken, getrennt von allen Synchronisierungen, die zur Aufrechterhaltung der Konsistenz des Pools selbst erforderlich sind.
Ein Semaphor, das zu einem initialisiert wird und so verwendet wird, dass nur höchstens eine Genehmigung verfügbar ist, kann als gegenseitige Ausschlusssperre dienen. Dies wird häufiger als <em>binary semaphore</em> bezeichnet, da es nur über zwei Zustände verfügt: eine Genehmigung verfügbar oder null Genehmigungen verfügbar. Bei dieser Verwendung hat der binäre Semaphor (im Gegensatz zu vielen java.util.concurrent.locks.Lock
Implementierungen) die -Eigenschaft, dass der " lock" kann von einem anderen Thread als dem Besitzer freigegeben werden (da Semaphore keinen Besitzbegriff haben). Dies kann in einigen speziellen Kontexten nützlich sein, z. B. bei der Deadlockwiederherstellung.
Der Konstruktor für diese Klasse akzeptiert optional einen <em>fairness</em-Parameter> . Wenn der Wert false festgelegt ist, gibt diese Klasse keine Garantien für die Reihenfolge ab, in der Threads Genehmigungen erhalten. Insbesondere <ist em>barging</em> zulässig, d. h., einem Thread, der aufgerufen #acquire
wird, kann eine Genehmigung vor einem Thread zugewiesen werden, der gewartet hat - logischerweise platziert sich der neue Thread an der Spitze der Warteschleife. Wenn fairness true festgelegt ist, garantiert das Semaphor, dass Fäden, die eine der #acquire() acquire
Methoden aufrufen, ausgewählt werden, um Genehmigungen in der Reihenfolge zu erhalten, in der ihr Aufruf dieser Methoden verarbeitet wurde (first-in-first-out; FIFO). Beachten Sie, dass die FIFO-Reihenfolge notwendigerweise für bestimmte interne Ausführungspunkte innerhalb dieser Methoden gilt. Daher ist es möglich, dass ein Thread vor einem anderen aufgerufen acquire
wird, aber den Reihenfolgespunkt nach dem anderen erreicht, und auf ähnliche Weise, wenn er von der -Methode zurückgegeben wird. Beachten Sie auch, dass die Methoden ohne Zeit #tryAcquire() tryAcquire
die Fairnesseinstellung nicht berücksichtigen, aber alle verfügbaren Genehmigungen annehmen.
Im Allgemeinen sollten Semaphore, die zum Steuern des Ressourcenzugriffs verwendet werden, als fair initialisiert werden, um sicherzustellen, dass kein Thread vom Zugriff auf eine Ressource ausgehungert wird. Bei der Verwendung von Semaphoren für andere Arten der Synchronisierungssteuerung überwiegen häufig die Durchsatzvorteile einer nicht fairen Reihenfolge.
Diese Klasse bietet auch bequeme Methoden für #acquire(int) acquire
und #release(int) release
mehrere Genehmigungen gleichzeitig. Diese Methoden sind im Allgemeinen effizienter und effektiver als Schleifen. Sie legen jedoch keine Präferenzreihenfolge fest. Wenn beispielsweise Thread A aufruft s.acquire(3
und Thread B aufruft und zwei Genehmigungen s.acquire(2)
verfügbar werden, gibt es keine Garantie dafür, dass Thread B sie erhält, es sei denn, sein Abruf kam zuerst und Semaphore befindet sich im fairen s
Modus.
Speicherkonsistenzeffekte: Aktionen in einem Thread vor dem Aufrufen einer "Release"-Methode wie release()
<i>happen-before</i-Aktionen> nach einer erfolgreichen "acquire"-Methode, z acquire()
. B. in einem anderen Thread.
Hinzugefügt in 1.5.
Java-Dokumentation für java.util.concurrent.Semaphore
.
Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
Semaphore(Int32) |
Erstellt eine |
Semaphore(Int32, Boolean) |
Erstellt eine |
Semaphore(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Runtime aufgerufen. |
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses |
Handle |
Das Handle für die zugrunde liegende Android-instance. (Geerbt von Object) |
HasQueuedThreads |
Fragt ab, ob Threads auf den Abruf warten. |
IsFair |
Gibt zurück |
JniIdentityHashCode |
Ein Zählsemaphor. (Geerbt von Object) |
JniPeerMembers |
Ein Zählsemaphor. |
PeerReference |
Ein Zählsemaphor. (Geerbt von Object) |
QueuedThreads |
Gibt eine Auflistung zurück, die Threads enthält, die möglicherweise auf den Abruf warten. |
QueueLength |
Gibt eine Schätzung der Anzahl der Threads zurück, die auf den Abruf warten. |
ThresholdClass |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
ThresholdType |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
Methoden
Acquire() |
Ruft eine Genehmigung von diesem Semaphor ab und blockiert, bis ein Thread verfügbar ist oder der Thread unterbrochen wird. |
Acquire(Int32) |
Ruft die angegebene Anzahl von Genehmigungen von diesem Semaphor ab und blockiert, bis alle verfügbar sind, oder der Thread wird von Thread#interrupt unterbrochen. |
AcquireUninterruptibly() |
Erwirbt eine Genehmigung von diesem Semaphor und blockiert, bis eine verfügbar ist. |
AcquireUninterruptibly(Int32) |
Ruft die angegebene Anzahl von Genehmigungen von diesem Semaphor ab und blockiert, bis alle verfügbar sind. |
AvailablePermits() |
Gibt die aktuelle Anzahl der in diesem Semaphor verfügbaren Genehmigungen zurück. |
Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
Dispose() |
Ein Zählsemaphor. (Geerbt von Object) |
Dispose(Boolean) |
Ein Zählsemaphor. (Geerbt von Object) |
DrainPermits() |
Erwirbt und gibt alle sofort verfügbaren Genehmigungen zurück, oder wenn negative Genehmigungen verfügbar sind, gibt sie frei. |
Equals(Object) |
Gibt an, ob ein anderes Objekt "gleich" diesem objekt ist. (Geerbt von Object) |
GetHashCode() |
Gibt einen Hashcodewert für das Objekt zurück. (Geerbt von Object) |
JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr auf das Objekt vorhanden sind. (Geerbt von Object) |
Notify() |
Aktiviert einen einzelnen Thread, der auf den Monitor dieses Objekts wartet. (Geerbt von Object) |
NotifyAll() |
Aktiviert alle Threads, die auf den Monitor dieses Objekts warten. (Geerbt von Object) |
ReducePermits(Int32) |
Verkleinert die Anzahl der verfügbaren Genehmigungen um die angegebene Reduzierung. |
Release() |
Gibt eine Genehmigung frei und gibt sie an den Semaphor zurück. |
Release(Int32) |
Gibt die angegebene Anzahl von Genehmigungen frei und gibt sie an den Semaphor zurück. |
SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
ToArray<T>() |
Ein Zählsemaphor. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
TryAcquire() |
Erwirbt von diesem Semaphor nur dann eine Genehmigung, wenn eine zum Zeitpunkt des Aufrufs verfügbar ist. |
TryAcquire(Int32) |
Erwirbt die angegebene Anzahl von Genehmigungen von diesem Semaphor nur, wenn alle zum Zeitpunkt des Aufrufs verfügbar sind. |
TryAcquire(Int32, Int64, TimeUnit) |
Ruft die angegebene Anzahl von Genehmigungen von diesem Semaphor ab, wenn alle innerhalb der angegebenen Wartezeit verfügbar sind und der aktuelle Thread nicht unterbrochen wurde. |
TryAcquire(Int64, TimeUnit) |
Ruft eine Genehmigung von diesem Semaphor ab, wenn eine innerhalb der angegebenen Wartezeit verfügbar ist und der aktuelle Thread nicht unterbrochen wurde. |
UnregisterFromRuntime() |
Ein Zählsemaphor. (Geerbt von Object) |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch <>Benachrichtigung</em> oder <em>interrupted</em>. (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.DisposeUnlessReferenced() |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.Finalized() |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.JniManagedPeerState |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Ein Zählsemaphor. (Geerbt von Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Ein Zählsemaphor. (Geerbt von Object) |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine Typkonvertierung mit Überprüfung der Android-Laufzeit aus. |
JavaCast<TResult>(IJavaObject) |
Ein Zählsemaphor. |
GetJniTypeName(IJavaPeerable) |
Ein Zählsemaphor. |