Sprache

Semaphore Klasse

Definition

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 mit der angegebenen Anzahl von Genehmigungen und der gegebenen Fairnesseinstellung.

Semaphore(Int32)

Erstellt eine Semaphore mit der angegebenen Anzahl von Genehmigungen und nicht fairen Fairness-Einstellungen.

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 Objectzurück.

(Geerbt von Object)
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 true , wenn dieser Semaphor den Wert "fairness" auf "true" festgelegt hat.

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 selfab.

JavaAs<TResult>(IJavaPeerable)

Versuchen Sie, die Eingabe selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

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 selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

Gilt für: