Freigeben über


StampedLock Klasse

Definition

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

(Geerbt von Object)
Handle

Das Handle für die zugrunde liegende Android-Instanz.

(Geerbt von Object)
IsReadLocked

Gibt zurück true , wenn die Sperre derzeit nicht exklusiv gehalten wird.

IsWriteLocked

Gibt zurück true , wenn die Sperre derzeit exklusiv gehalten wird.

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 Lock Ansicht dieses StampedLock zurück, in der die Lock#lock Methode zugeordnet #readLockist, und ähnlich für andere Methoden.

AsReadWriteLock()

Gibt eine ReadWriteLock Ansicht dieses StampedLock zurück, in der die ReadWriteLock#readLock() Methode zugeordnet #asReadLock()ist und ReadWriteLock#writeLock() der #asWriteLock().

AsWriteLock()

Gibt eine einfache Lock Ansicht dieses StampedLock zurück, in der die Lock#lock Methode zugeordnet #writeLockist, und ähnlich für andere Methoden.

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.

Gilt für: