ReentrantReadWriteLock 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.
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
- 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(Boolean) |
Erstellt eine neue |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| Equals(Object) |
Eine Implementierung der Unterstützung ähnlicher |
| 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 |
| 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 |
| IJavaPeerable.Finalized() |
Eine Implementierung der Unterstützung ähnlicher |
| IJavaPeerable.JniObjectReferenceControlBlock |
Eine Implementierung der Unterstützung ähnlicher |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Eine Implementierung der Unterstützung ähnlicher |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Eine Implementierung der Unterstützung ähnlicher |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Eine Implementierung der Unterstützung ähnlicher |
| IJavaPeerable.UnregisterFromRuntime() |
Eine Implementierung der Unterstützung ähnlicher |
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) |
Eine Implementierung der Unterstützung ähnlicher |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Versuchen Sie, die Eingabe |