StampedLock 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 funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs.
[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)>]
type StampedLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Vererbung
- Attribute
- Implementiert
Hinweise
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. Der Zustand eines StampedLock besteht aus einer Version und einem Modus. Lock acquisition methods return a stamp that represents and controls access with a lock state; "try"-Versionen dieser Methoden geben möglicherweise stattdessen den speziellen Wert Null zurück, um fehler beim Abrufen des Zugriffs darzustellen. Sperrversions- und Konvertierungsmethoden erfordern Stempel als Argumente und schlagen fehl, wenn sie nicht mit dem Zustand der Sperre übereinstimmen. Die drei Modi sind:
<ul>
<li><b>Schrift.</b-Methode> #writeLock
blockiert möglicherweise das Warten auf exklusiven Zugriff und gibt einen Stempel zurück, der in der Methode #unlockWrite
zum Freigeben der Sperre verwendet werden kann. Nichttimen- und Zeitversionen von tryWriteLock
werden ebenfalls bereitgestellt. Wenn die Sperre im Schreibmodus gehalten wird, werden möglicherweise keine Lesesperren abgerufen, und alle optimistischen Leseüberprüfungen schlagen fehl.
<li><b>Lesen.</b-Methode> #readLock
blockiert möglicherweise das Warten auf nicht exklusiven Zugriff und gibt einen Stempel zurück, der in der Methode #unlockRead
zum Freigeben der Sperre verwendet werden kann. Nichttimen- und Zeitversionen von tryReadLock
werden ebenfalls bereitgestellt.
<li><b>Optimistisches Lesen.</b-Methode> #tryOptimisticRead
gibt einen Nicht-Null-Stempel nur zurück, wenn die Sperre derzeit nicht im Schreibmodus gehalten wird. Die Methode #validate
gibt "true" zurück, wenn die Sperre seit dem Abrufen eines bestimmten Stempels nicht im Schreibmodus abgerufen wurde. In diesem Fall werden alle Aktionen vor der letzten Schreibsperre vor Aktionen ausgeführt, die auf den Aufruf folgen tryOptimisticRead
. Dieser Modus kann als extrem schwache Version einer Lesesperre betrachtet werden, die von einem Autor jederzeit unterbrochen werden kann. Die Verwendung des optimistischen Lesemodus für kurze schreibgeschützte Codesegmente reduziert häufig den Inhalt und verbessert den Durchsatz. Ihre Verwendung ist jedoch inhärent zerbrechlich. Optimistische Leseabschnitte sollten nur Felder lesen und in lokalen Variablen zur späteren Verwendung nach der Überprüfung speichern. Felder, die im optimistischen Lesemodus gelesen werden, sind möglicherweise inkonsistent. Die Verwendung gilt daher nur, wenn Sie mit Datendarstellungen vertraut sind, um die Konsistenz zu überprüfen und/oder wiederholt die Methode validate()
aufzurufen. Solche Schritte sind z. B. in der Regel erforderlich, wenn sie zuerst ein Objekt oder einen Arrayverweis lesen und dann auf eines seiner Felder, Elemente oder Methoden zugreifen.
</ul>
Diese Klasse unterstützt auch Methoden, die konvertierungen in den drei Modi bedingt bereitstellen. Beispielsweise versucht die Methode #tryConvertToWriteLock
, einen Modus zu "aktualisieren", einen gültigen Schreibstempel zurückzugeben, wenn (1) sich bereits im Schreibmodus (2) im Lesemodus befindet und keine anderen Leser oder (3) im optimistischen Lesemodus vorhanden sind und die Sperre verfügbar ist. Die Formen dieser Methoden dienen dazu, einige der Codeblähungen zu reduzieren, die andernfalls in wiederholungsbasierten Designs auftreten.
StampedLocks sind für die Verwendung als interne Dienstprogramme bei der Entwicklung threadsicherer Komponenten konzipiert. Ihre Verwendung basiert auf dem Wissen über die internen Eigenschaften der Daten, Objekte und Methoden, die sie schützen. Sie sind nicht erneut aktiv, daher sollten gesperrte Körper keine anderen unbekannten Methoden aufrufen, die versuchen können, Sperren erneut abzurufen (obwohl Sie möglicherweise einen Stempel an andere Methoden übergeben, die sie verwenden oder konvertieren können). Die Verwendung von Lesesperrmodi basiert auf den zugehörigen Codeabschnitten, die seiteneffektfrei sind. Nichtvalidierte optimistische Leseabschnitte können keine Methoden aufrufen, die nicht bekannt sind, um potenzielle Inkonsistenzen zu tolerieren. Stempel verwenden endliche Darstellungen und sind nicht kryptografisch sicher (d. h. ein gültiger Stempel kann erraten werden). Stempelwerte können nach (nicht früher als) einem Jahr fortlaufender Betrieb wiederverwendet werden. Ein Stempel, der länger als dieser Zeitraum ohne Verwendung oder Überprüfung gehalten wird, kann nicht ordnungsgemäß überprüft werden. StampedLocks sind serialisierbar, aber immer in den anfänglichen entsperrten Zustand deserialisieren, sodass sie für die Remotesperrung nicht nützlich sind.
Wie java.util.concurrent.Semaphore Semaphore
, aber im Gegensatz zu den meisten Lock
Implementierungen haben StampedLocks keine Vorstellung von Eigentum. In einem Thread erworbene Sperren können freigegeben oder in einem anderen konvertiert werden.
Die Planungsrichtlinie von StampedLock bevorzugt nicht konsistent Leser gegenüber Autoren oder umgekehrt. Alle "try"-Methoden sind best-effort und entsprechen nicht unbedingt einer Terminplanungs- oder Fairnessrichtlinie. Eine Nullrückgabe von einer "try"-Methode zum Abrufen oder Konvertieren von Sperren enthält keine Informationen zum Zustand der Sperre; Ein nachfolgender Aufruf kann erfolgreich sein.
Da sie die koordinierte Verwendung über mehrere Sperrmodi hinweg unterstützt, implementiert diese Klasse die Lock
Oder ReadWriteLock
Schnittstellen nicht direkt. Ein StampedLock kann jedoch angezeigt #asReadLock()
werden, #asWriteLock()
oder #asReadWriteLock()
in Anwendungen, die nur den zugeordneten Satz von Funktionen erfordern.
<b>Speichersynchronisierung.</b> Methoden mit dem Effekt der erfolgreichen Sperrung in jedem Modus haben dieselben Speichersynchronisierungseffekte wie eine <em>Lock</em-Aktion> , wie in Kapitel 17 von <Cite>The Java Language Specification</cite> beschrieben. Methoden, die im Schreibmodus erfolgreich entsperrt werden, haben dieselben Speichersynchronisierungseffekte wie eine <Em-Entsperrungs><-/Em-Aktion>. Bei optimistischen Leseverwendungen werden Aktionen vor der letzten Aktion zum Entsperren des Schreibmodus garantiert, bevor die Aktionen ausgeführt werden, die einem tryOptimisticRead folgen, nur wenn eine spätere Überprüfung "true" zurückgibt; andernfalls besteht keine Garantie dafür, dass die Lesevorgänge zwischen tryOptimisticRead und validieren eine konsistente Momentaufnahme erhalten.
<b>Beispielverwendung.</b> Im Folgenden werden einige Verwendungs-Idiome in einer Klasse veranschaulicht, die einfache zweidimensionale Punkte verwaltet. Der Beispielcode veranschaulicht einige Try/Catch-Konventionen, obwohl sie hier nicht unbedingt benötigt werden, da keine Ausnahmen in ihren Körpern auftreten können.
{@code
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
// an exclusively locked method
void move(double deltaX, double deltaY) {
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
// a read-only method
// upgrade from optimistic read to read lock
double distanceFromOrigin() {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.readLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
return Math.hypot(currentX, currentY);
}
} finally {
if (StampedLock.isReadLockStamp(stamp))
sl.unlockRead(stamp);
}
}
// upgrade from optimistic read to write lock
void moveIfAtOrigin(double newX, double newY) {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.writeLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
if (currentX != 0.0 || currentY != 0.0)
break;
stamp = sl.tryConvertToWriteLock(stamp);
if (stamp == 0L)
continue retryHoldingLock;
// exclusive access
x = newX;
y = newY;
return;
}
} finally {
if (StampedLock.isWriteLockStamp(stamp))
sl.unlockWrite(stamp);
}
}
// upgrade read lock to write lock
void moveIfAtOrigin2(double newX, double newY) {
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}}
Hinzugefügt in 1.8.
Java-Dokumentation für java.util.concurrent.locks.StampedLock
.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
StampedLock() |
Erstellt zunächst im nicht gesperrten Zustand eine neue Sperre. |
StampedLock(IntPtr, JniHandleOwnership) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses Werts |
Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
IsReadLocked |
Gibt zurück |
IsWriteLocked |
Gibt zurück |
JniIdentityHashCode |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
JniPeerMembers |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |
PeerReference |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
ReadLockCount |
Fragt die Anzahl der Lesesperren ab, die für diese Sperre gehalten werden. |
ThresholdClass |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |
ThresholdType |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |
Methoden
AsReadLock() |
Gibt eine einfache |
AsReadWriteLock() |
Gibt eine |
AsWriteLock() |
Gibt eine einfache |
Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
Dispose() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
Dispose(Boolean) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
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) |
IsLockStamp(Int64) |
Gibt an, ob ein Stempel eine Sperre enthält. |
IsOptimisticReadStamp(Int64) |
Gibt an, ob ein Stempel einen erfolgreichen optimistischen Lesevorgang darstellt. |
IsReadLockStamp(Int64) |
Gibt an, ob ein Stempel eine Sperre darstellt, die nicht ausschließlich gesperrt ist. |
IsWriteLockStamp(Int64) |
Gibt an, ob ein Stempel eine Sperre exklusiv hält. |
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() |
Nicht ausschließlich erwirbt die Sperre, falls erforderlich, bis sie verfügbar ist. |
ReadLockInterruptibly() |
Wird die Sperre nicht exklusiv abgerufen, wird ggf. blockiert, bis der aktuelle Thread unterbrochen wird. |
SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
ToArray<T>() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
TryConvertToOptimisticRead(Int64) |
Wenn der Sperrzustand mit dem angegebenen Stempel übereinstimmt, gibt der Stempel atomisch an, wenn der Stempel eine Sperre hält, loslässt ihn und gibt einen Beobachtungsstempel zurück. |
TryConvertToReadLock(Int64) |
Wenn der Sperrzustand mit dem angegebenen Stempel übereinstimmt, führt sie eine der folgenden Aktionen aus. |
TryConvertToWriteLock(Int64) |
Wenn der Sperrzustand mit dem angegebenen Stempel übereinstimmt, führt sie eine der folgenden Aktionen aus. |
TryOptimisticRead() |
Gibt einen Stempel zurück, der später überprüft werden kann, oder null, wenn er exklusiv gesperrt ist. |
TryReadLock() |
Nicht ausschließlich erwirbt die Sperre, wenn sie sofort verfügbar ist. |
TryReadLock(Int64, TimeUnit) |
Wird die Sperre nicht ausschließlich abgerufen, wenn sie innerhalb des angegebenen Zeitraums verfügbar ist und der aktuelle Thread nicht unterbrochen wurde. |
TryUnlockRead() |
Gibt einen Halteraum der Lesesperre frei, wenn sie gehalten wird, ohne dass ein Stempelwert erforderlich ist. |
TryUnlockWrite() |
Gibt die Schreibsperre frei, wenn sie gehalten wird, ohne dass ein Stempelwert erforderlich ist. |
TryWriteLock() |
Erwirbt die Sperre ausschließlich, wenn sie sofort verfügbar ist. |
TryWriteLock(Int64, TimeUnit) |
Erwirbt die Sperre ausschließlich, wenn sie innerhalb des angegebenen Zeitraums verfügbar ist und der aktuelle Thread nicht unterbrochen wurde. |
Unlock(Int64) |
Wenn der Sperrzustand mit dem angegebenen Stempel übereinstimmt, wird der entsprechende Sperrmodus freigegeben. |
UnlockRead(Int64) |
Wenn der Sperrzustand dem angegebenen Stempel entspricht, gibt die nicht exklusive Sperre los. |
UnlockWrite(Int64) |
Wenn der Sperrzustand dem angegebenen Stempel entspricht, gibt die exklusive Sperre los. |
UnregisterFromRuntime() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
Validate(Int64) |
Gibt true zurück, wenn die Sperre seit der Ausstellung des angegebenen Stempels nicht exklusiv erworben wurde. |
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() |
Erwirbt die Sperre ausschließlich, falls erforderlich, bis sie verfügbar ist. |
WriteLockInterruptibly() |
Erwirbt die Sperre ausschließlich, falls erforderlich, bis der aktuelle Thread unterbrochen wird. |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.DisposeUnlessReferenced() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.Finalized() |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.JniManagedPeerState |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. (Geerbt von Object) |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
JavaCast<TResult>(IJavaObject) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |
GetJniTypeName(IJavaPeerable) |
Eine funktionsbasierte Sperre mit drei Modi zum Steuern des Lese-/Schreibzugriffs. |