ReentrantReadWriteLock Klasse

Definition

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

[Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)]
public class ReentrantReadWriteLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Util.Concurrent.Locks.IReadWriteLock
[<Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)>]
type ReentrantReadWriteLock = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IReadWriteLock
Vererbung
ReentrantReadWriteLock
Attribute
Implementiert

Hinweise

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

Diese Klasse hat die folgenden Eigenschaften:

<ul><li><b>Kaufauftrag</b>

Diese Klasse erzwingt keine Lese- oder Schreibeinstellungen für den Sperrzugriff. Sie unterstützt jedoch eine optionale <Em>Fairness</Em-Richtlinie> .

<dl><dt><b>Nicht-fairer Modus (Standard)</b><dd>Bei Der Konstruktion als nicht fair (Standard) ist die Reihenfolge des Eintrags in die Lese- und Schreibsperre nicht angegeben, unterliegt erneuten Fälligkeitseinschränkungen. Eine nicht faire Sperre, die ständig behauptet wird, kann einen oder mehrere Leser- oder Writer-Threads auf unbestimmte Zeit verschieben, hat jedoch normalerweise einen höheren Durchsatz als eine faire Sperre.

<dt><b>Fair mode</b><dd>Bei der Konstruktion als fair, Fäden für die Einreise mit einer ungefähr antreffenden Auftragsrichtlinie. Wenn die aktuell gehaltene Sperre freigegeben wird, wird entweder dem längsten single writer-Thread die Schreibsperre zugewiesen, oder wenn eine Gruppe von Lesethreads länger als alle wartenden Writer-Threads wartet, wird dieser Gruppe die Lesesperre zugewiesen.

Ein Thread, der versucht, eine faire Lesesperre (nicht erneut) zu erhalten, wird blockiert, wenn entweder die Schreibsperre gehalten wird, oder ein wartender Writer-Thread vorhanden ist. Der Thread erhält die Lesesperre erst, nachdem der älteste derzeit wartende Writer-Thread die Schreibsperre abgerufen und freigegeben hat. Wenn ein wartende Autor seine Wartezeit abgibt, eine oder mehrere Lesethreads als die längsten Warteschleifen in der Warteschlange mit der Schreibsperre frei lassen, wird diesen Lesern die Lesesperre zugewiesen.

Ein Thread, der versucht, eine faire Schreibsperre (nicht erneut) zu erhalten, wird blockiert, es sei denn, sowohl die Lese- als auch die Schreibsperre sind frei (was bedeutet, dass keine Wartethreads vorhanden sind). (Beachten Sie, dass die nicht blockierenden ReadLock#tryLock() und WriteLock#tryLock() Methoden diese faire Einstellung nicht berücksichtigen und die Sperre sofort erwerben, wenn es möglich ist, unabhängig von Wartethreads.) </dl>

<li><b>Reentrancy</b>

Diese Sperre ermöglicht es Lesern und Autoren, Lese- oder Schreibsperren im Stil eines .ReentrantLock Nicht wiederholte Leser sind erst zulässig, wenn alle Schreibsperren, die vom Schreibthread gehalten werden, freigegeben wurden.

Darüber hinaus kann ein Autor die Lesesperre erwerben, aber nicht umgekehrt. Unter anderen Anwendungen kann die Erneute Schreibung hilfreich sein, wenn Schreibsperren während Aufrufen oder Rückrufen an Methoden gehalten werden, die Lesevorgänge unter Lesesperren ausführen. Wenn ein Leser versucht, die Schreibsperre zu erwerben, wird sie nie erfolgreich ausgeführt.

<li><b>Lock downgrading</b>

Reentrancy ermöglicht auch das Herabstufen von der Schreibsperre auf eine Lesesperre, indem die Schreibsperre abgerufen wird, dann die Lesesperre und dann die Schreibsperre losgelassen wird. Ein Upgrade von einer Lesesperre auf die Schreibsperre ist <jedoch b>/b< nicht> möglich.

<li><b>Unterbrechung des Lock-Erwerbs</b>

Die Lese- und Schreibsperre unterstützt beide Unterbrechungen während der Sperrerfassung.

<li><b>Condition support</b>

Die Schreibsperre stellt eine Condition Implementierung bereit, die sich in Bezug auf die Schreibsperre auf die gleiche Weise verhält, wie die von der Condition Implementierung bereitgestellt für ReentrantLock#newConditionReentrantLock. Dies Condition kann natürlich nur mit der Schreibsperre verwendet werden.

Die Lesesperre unterstützt keine Condition Und readLock().newCondition() löst sie aus UnsupportedOperationException.

<li><b>Instrumentation</b>

Diese Klasse unterstützt Methoden, um zu bestimmen, ob Sperren gehalten oder behauptet werden. Diese Methoden sind für die Überwachung des Systemzustands konzipiert, nicht für die Synchronisierungskontrolle. </ul>

Die Serialisierung dieser Klasse verhält sich auf die gleiche Weise wie integrierte Sperren: Eine deserialisierte Sperre befindet sich unabhängig vom Zustand der Serialisierung im nicht gesperrten Zustand.

<b>Beispielverwendungen.</b> Hier ist eine Codeskizze, die zeigt, wie Das Sperren nach dem Aktualisieren eines Caches ausgeführt wird (Ausnahmebehandlung ist besonders schwierig beim Behandeln mehrerer Sperren in nicht geschachtelter Weise):

{@code
            class CachedData {
              Object data;
              boolean cacheValid;
              final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

              void processCachedData() {
                rwl.readLock().lock();
                if (!cacheValid) {
                  // Must release read lock before acquiring write lock
                  rwl.readLock().unlock();
                  rwl.writeLock().lock();
                  try {
                    // Recheck state because another thread might have
                    // acquired write lock and changed state before we did.
                    if (!cacheValid) {
                      data = ...;
                      cacheValid = true;
                    }
                    // Downgrade by acquiring read lock before releasing write lock
                    rwl.readLock().lock();
                  } finally {
                    rwl.writeLock().unlock(); // Unlock write, still hold read
                  }
                }

                try {
                  use(data);
                } finally {
                  rwl.readLock().unlock();
                }
              }
            }}

ReentrantReadWriteLocks können verwendet werden, um die Parallelität in einigen Arten von Sammlungen zu verbessern. Dies lohnt sich in der Regel nur, wenn die Sammlungen voraussichtlich groß sind und von mehr Lesethreads als Writer-Threads zugegriffen wird und Vorgänge mit mehr Aufwand verbunden sind, der den Synchronisierungsaufwand überwiegt. Hier ist beispielsweise eine Klasse mit einer TreeMap, die erwartet wird, dass sie groß und gleichzeitig darauf zugegriffen wird.

{@code
            class RWDictionary {
              private final Map<String, Data> m = new TreeMap<>();
              private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
              private final Lock r = rwl.readLock();
              private final Lock w = rwl.writeLock();

              public Data get(String key) {
                r.lock();
                try { return m.get(key); }
                finally { r.unlock(); }
              }
              public List<String> allKeys() {
                r.lock();
                try { return new ArrayList<>(m.keySet()); }
                finally { r.unlock(); }
              }
              public Data put(String key, Data value) {
                w.lock();
                try { return m.put(key, value); }
                finally { w.unlock(); }
              }
              public void clear() {
                w.lock();
                try { m.clear(); }
                finally { w.unlock(); }
              }
            }}

<h2>Implementierungshinweise</h2>

Diese Sperre unterstützt maximal 65535 rekursive Schreibsperren und Lesesperren von 65535. Versuche, diese Grenzwerte zu überschreiten, führen dazu Error , dass Die Sperrmethoden ausgelöst werden.

Hinzugefügt in 1.5.

Java Dokumentation für java.util.concurrent.locks.ReentrantReadWriteLock.

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
ReentrantReadWriteLock()

Erstellt eine neue ReentrantReadWriteLock Sortierungseigenschaft (nonfair) mit Standardreihenfolgen.

ReentrantReadWriteLock(Boolean)

Erstellt eine neue ReentrantReadWriteLock mit der gegebenen Fairness-Politik.

ReentrantReadWriteLock(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 warten, um die Lese- oder Schreibsperre abzurufen.

IsFair

Gibt zurück true , wenn diese Sperre "Fairness" auf "true" festgelegt hat.

IsWriteLocked

Abfragen, wenn die Schreibsperre von einem beliebigen Thread gehalten wird.

IsWriteLockedByCurrentThread

Abfragen, wenn die Schreibsperre vom aktuellen Thread gehalten wird.

JniIdentityHashCode

Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist.

(Geerbt von Object)
JniManagedPeerState

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
JniPeerMembers

Ruft die JNI-Metadaten ab, die zum Aufrufen von Mitgliedern dieses Java Peers verwendet werden.

Owner

Gibt den Thread zurück, der zurzeit die Schreibsperre besitzt oder null nicht im Besitz ist.

PeerReference

Ruft den JNI-Objektverweis für diesen Java Peer ab.

(Geerbt von Object)
QueuedReaderThreads

Gibt eine Auflistung zurück, die Threads enthält, die möglicherweise darauf warten, die Lesesperre abzurufen.

QueuedThreads

Gibt eine Auflistung zurück, die Threads enthält, die möglicherweise warten, um die Lese- oder Schreibsperre abzurufen.

QueuedWriterThreads

Gibt eine Auflistung zurück, die Threads enthält, die auf den Erwerb der Schreibsperre warten können.

QueueLength

Gibt eine Schätzung der Anzahl der Threads zurück, die auf das Abrufen der Lese- oder Schreibsperre warten.

ReadHoldCount

Fragt die Anzahl der erneuten Lesebereiche für diese Sperre durch den aktuellen Thread ab.

ReadLockCount

Fragt die Anzahl der Lesesperren ab, die für diese Sperre gehalten werden.

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.

WriteHoldCount

Fragt die Anzahl der erneuten Schreibvorgänge für diese Sperre durch den aktuellen Thread ab.

Methoden

Name Beschreibung
Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(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()

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
Equals(Object)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(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)
GetWaitingThreads(ICondition)

Gibt eine Auflistung zurück, die diese Threads enthält, die möglicherweise auf die angegebene Bedingung warten, die der Schreibsperre zugeordnet ist.

GetWaitQueueLength(ICondition)

Gibt eine Schätzung der Anzahl der Threads zurück, die auf die angegebene Bedingung warten, die der Schreibsperre zugeordnet ist.

HasQueuedThread(Thread)

Fragt ab, ob der angegebene Thread wartet, um entweder die Lese- oder Schreibsperre abzurufen.

HasWaiters(ICondition)

Fragt ab, ob Threads auf die angegebene Bedingung warten, die der Schreibsperre zugeordnet ist.

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)
ReadLock()

Gibt die zum Lesen verwendete Sperre zurück.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(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)
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)
WriteLock()

Gibt die zum Schreiben verwendete Sperre zurück.

Explizite Schnittstellenimplementierungen

Name Beschreibung
IJavaPeerable.Disposed()

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.Finalized()

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

(Geerbt von JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

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)

Eine Implementierung der Unterstützung ähnlicher ReadWriteLock Semantik wie ReentrantLock.

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: