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ähl-Semaphor.
[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, 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ähl-Semaphor. Konzeptionell behält ein Semaphor eine Reihe von Genehmigungen bei. Jede #acquire Blöcke, sofern erforderlich, bis eine Genehmigung verfügbar ist, und nimmt sie dann. Jeder #release fügt eine Genehmigung hinzu, die potenziell einen blockierenden Acquirer freigibt. Es werden jedoch keine tatsächlichen Genehmigungsobjekte verwendet; die Semaphore Anzahl der verfügbaren Nummern wird nur beibehalten und entsprechend handlungen.
Semaphore werden häufig verwendet, um die Anzahl der Threads einzuschränken, als auf einige (physische oder logische) Ressourcen zugreifen können. Hier ist 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, wodurch sichergestellt wird, dass ein Element zur Verwendung verfügbar ist. Wenn der Thread mit dem Element fertig ist, wird es wieder an den Pool zurückgegeben, und eine Genehmigung wird an das Semaphor zurückgegeben, sodass ein anderer Thread dieses Element abrufen kann. Beachten Sie, dass keine Synchronisierungssperre gehalten wird, wenn #acquire sie aufgerufen wird, da dadurch verhindert wird, dass ein Element an den Pool zurückgegeben wird. Das Semaphor kapselt die Synchronisierung, die erforderlich ist, um den Zugriff auf den Pool einzuschränken, getrennt von jeder Synchronisierung, die erforderlich ist, um die Konsistenz des Pools selbst aufrechtzuerhalten.
Ein Semaphor initialisiert für eins, das so verwendet wird, dass es nur über höchstens eine genehmigungsfähig ist, kann als gegenseitige Ausschlusssperre dienen. Dies wird häufiger als em <>binary semaphor</em> bezeichnet, da sie nur zwei Zustände aufweist: eine Genehmigung verfügbar oder null genehmigungen verfügbar. Bei verwendung auf diese Weise hat der binäre Semaphor die Eigenschaft (im Gegensatz zu vielen java.util.concurrent.locks.Lock Implementierungen), dass das " sperren" kann von einem anderen Thread als dem Besitzer freigegeben werden (da Semaphoren keinen Besitz haben). Dies kann in einigen speziellen Kontexten hilfreich sein, z. B. die Deadlock-Wiederherstellung.
Der Konstruktor für diese Klasse akzeptiert optional einen <em>fairness</em-Parameter> . Wenn "false" festgelegt wird, garantiert diese Klasse keine Garantien für die Reihenfolge, in der Threads Genehmigungen erwerben. Insbesondere <ist em>barging</em> zulässig, d. h. ein Thread,der aufruft #acquire , kann eine Genehmigung vor einem Thread zugewiesen werden, der gewartet wurde - logisch platziert sich der neue Thread an der Spitze der Warteschleife von Wartethreads. Wenn die Fairness wahr ist, garantiert der Semaphor, dass Threads, die eine der #acquire() acquire Methoden aufrufen, ausgewählt werden, um Genehmigungen in der Reihenfolge zu erhalten, in der ihre Aufrufe dieser Methoden verarbeitet wurden (first-in-first-out; FIFO). Beachten Sie, dass die FIFO-Sortierung unbedingt auf bestimmte interne Ausführungspunkte innerhalb dieser Methoden angewendet wird. Daher ist es möglich, dass ein Thread vor einem anderen aufgerufen wird acquire , aber den Sortierpunkt nach dem anderen erreicht, und ähnlich, wenn die Methode zurückgegeben wird. Beachten Sie außerdem, dass die unbezeitigten #tryAcquire() tryAcquire Methoden die Fairnesseinstellung nicht berücksichtigen, sondern alle verfügbaren Genehmigungen übernehmen.
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 Synchronisierungskontrolle überwiegen die Durchsatzvorteile der nicht fairen Sortierung häufig die Fairnessüberlegungen.
Diese Klasse bietet auch Komfortmethoden und #acquire(int) acquire#release(int) release mehrere Genehmigungen gleichzeitig. Diese Methoden sind im Allgemeinen effizienter und effektiver als Schleifen. Sie richten jedoch keine Einstellungsreihenfolge ein. Wenn thread A beispielsweise aufruft s.acquire(3) und Thread B aufgerufen wird und zwei Genehmigungen s.acquire(2)verfügbar sind, gibt es keine Garantie dafür, dass Thread B sie erhält, es sei denn, der Erwerb erfolgte zuerst und Semaphor s ist im fairen Modus.
Auswirkungen der Speicherkonsistenz: Aktionen in einem Thread vor dem Aufrufen einer "Release"-Methode wie release()<i>happen-before</i-Aktionen> nach einer erfolgreichen "acquire"-Methode wie acquire() in einem anderen Thread.
Hinzugefügt in 1.5.
Java Dokumentation für java.util.concurrent.Semaphore.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
| Name | Beschreibung |
|---|---|
| Semaphore(Int32, Boolean) |
Erstellt eine |
| Semaphore(Int32) |
Erstellt eine |
| Semaphore(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Laufzeit aufgerufen. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Class |
Gibt die Laufzeitklasse dieses Werts |
| Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
| HasQueuedThreads |
Fragt ab, ob Threads auf den Erwerb warten. |
| IsFair |
Gibt zurück |
| JniIdentityHashCode |
Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist. (Geerbt von Object) |
| JniManagedPeerState |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| JniPeerMembers |
Ein Zähl-Semaphor. |
| PeerReference |
Ruft den JNI-Objektverweis für diesen Java Peer ab. (Geerbt von Object) |
| QueuedThreads |
Gibt eine Auflistung zurück, die Threads enthält, die möglicherweise auf den Erwerb warten. |
| QueueLength |
Gibt eine Schätzung der Anzahl der Threads zurück, die auf den Erwerb 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
| Name | Beschreibung |
|---|---|
| Acquire() |
Erwirbt eine Genehmigung von diesem Semaphor, blockiert, bis eine verfügbar ist, oder der Thread ist Thread#interrupt unterbrochen. |
| Acquire(Int32) |
Erwirbt die angegebene Anzahl von Genehmigungen von diesem Semaphor, sperrt, bis alle verfügbar sind, oder der Thread ist Thread#interrupt unterbrochen. |
| AcquireUninterruptibly() |
Erwirbt eine Genehmigung von diesem Semaphor, die blockiert wird, bis eine verfügbar ist. |
| AcquireUninterruptibly(Int32) |
Erwirbt die angegebene Anzahl von Genehmigungen von diesem Semaphor, die blockiert werden, 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) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| Dispose() |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| Dispose(Boolean) |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| DisposeUnlessReferenced() |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| DrainPermits() |
Erwirbt und gibt alle Genehmigungen zurück, die sofort verfügbar sind, oder wenn negative Genehmigungen verfügbar sind, gibt sie frei. |
| Equals(Object) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| 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 bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind. (Geerbt von Object) |
| Notify() |
Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet. (Geerbt von Object) |
| NotifyAll() |
Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten. (Geerbt von Object) |
| ReducePermits(Int32) |
Verkleinert die Anzahl der verfügbaren Genehmigungen durch die angegebene Reduzierung. |
| Release() |
Gibt eine Genehmigung frei und kehrt sie zum Semaphor zurück. |
| Release(Int32) |
Gibt die angegebene Anzahl von Genehmigungen frei und gibt sie an das Semaphor zurück. |
| SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| ToArray<T>() |
Erstellt ein verwaltetes Array aus diesem Java Arraywrapper. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
| TryAcquire() |
Erwirbt eine Genehmigung von diesem Semaphor, nur wenn eine zum Zeitpunkt des Aufrufs verfügbar ist. |
| TryAcquire(Int32, Int64, TimeUnit) |
Erwirbt die angegebene Anzahl von Genehmigungen von diesem Semaphor, wenn alle innerhalb der angegebenen Wartezeit verfügbar sind und der aktuelle Thread nicht unterbrochen wurde. |
| TryAcquire(Int32) |
Erwirbt die angegebene Anzahl von Genehmigungen von diesem Semaphor, nur wenn alle zum Zeitpunkt des Aufrufs verfügbar sind. |
| TryAcquire(Int64, TimeUnit) |
Erwirbt eine Genehmigung von diesem Semaphor, wenn eine innerhalb der angegebenen Wartezeit verfügbar ist und der aktuelle Thread nicht thread#interrupt unterbrochen wurde. |
| UnregisterFromRuntime() |
Hebt die Registrierung dieses Java Peers aus der Interop-Laufzeit auf. (Geerbt von Object) |
| Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em< oder >em<unterbrochen>/em<.><> (Geerbt von Object) |
| Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
| Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| IJavaPeerable.Disposed() |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.Finalized() |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Ein Zähl-Semaphor. (Geerbt von JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Ein Zähl-Semaphor. |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Ruft den JNI-Namen des Typs der Instanz |
| JavaAs<TResult>(IJavaPeerable) |
Versuchen Sie, die Eingabe |
| JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
| JavaCast<TResult>(IJavaObject) |
Ein Zähl-Semaphor. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Versuchen Sie, die Eingabe |