Compartir a través de


StampedLock Clase

Definición

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

[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
Herencia
StampedLock
Atributos
Implementaciones

Comentarios

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura. El estado de stampedLock consta de una versión y modo. Los métodos de adquisición de bloqueo devuelven un sello que representa y controla el acceso con respecto a un estado de bloqueo; En su lugar, las versiones "try" de estos métodos pueden devolver el valor especial cero para representar un error al adquirir acceso. Los métodos de liberación y conversión de bloqueo requieren sellos como argumentos y se produce un error si no coinciden con el estado del bloqueo. Los tres modos son los siguientes:

<ul>

<li><b>Escritura.</b> Método #writeLock posiblemente bloquea la espera de acceso exclusivo, devolviendo un sello que se puede usar en el método #unlockWrite para liberar el bloqueo. También se proporcionan versiones sin tiempo y con tiempo de tryWriteLock . Cuando el bloqueo se mantiene en modo de escritura, no se pueden obtener bloqueos de lectura y se producirá un error en todas las validaciones de lectura optimistas.

<li><b>Lectura.<El método #readLock /b> posiblemente bloquea la espera de acceso no exclusivo, devolviendo un sello que se puede usar en el método #unlockRead para liberar el bloqueo. También se proporcionan versiones sin tiempo y con tiempo de tryReadLock .

<li><b>Lectura optimista.</b> El método #tryOptimisticRead devuelve un sello distinto de cero solo si el bloqueo no se mantiene actualmente en modo de escritura. El método #validate devuelve true si el bloqueo no se ha adquirido en modo de escritura desde la obtención de una marca determinada, en cuyo caso todas las acciones anteriores a la versión de bloqueo de escritura más reciente se producen antes de que se realicen acciones después de la llamada a tryOptimisticRead. Este modo puede considerarse una versión extremadamente débil de un bloqueo de lectura, que un escritor puede romper en cualquier momento. El uso del modo de lectura optimista para segmentos de código de solo lectura breve a menudo reduce la contención y mejora el rendimiento. Sin embargo, su uso es inherentemente frágil. Las secciones de lectura optimista solo deben leer campos y contenerlos en variables locales para su uso posterior después de la validación. Los campos leídos mientras están en modo de lectura optimista pueden ser incoherentes, por lo que el uso solo se aplica cuando está familiarizado con las representaciones de datos para comprobar la coherencia o invocar repetidamente el método validate(). Por ejemplo, estos pasos suelen ser necesarios al leer por primera vez una referencia de objeto o matriz y, a continuación, acceder a uno de sus campos, elementos o métodos.

</ul>

Esta clase también admite métodos que proporcionan condicionalmente conversiones en los tres modos. Por ejemplo, el método #tryConvertToWriteLock intenta "actualizar" un modo, devolviendo una marca de escritura válida si (1) ya está en modo de escritura (2) en modo de lectura y no hay otros lectores o (3) en modo de lectura optimista y el bloqueo está disponible. Las formas de estos métodos están diseñadas para ayudar a reducir parte del sobredimensionamiento del código que, de lo contrario, se produce en diseños basados en reintentos.

StampedLocks está diseñado para su uso como utilidades internas en el desarrollo de componentes seguros para subprocesos. Su uso se basa en el conocimiento de las propiedades internas de los datos, objetos y métodos que protegen. No son reentrantes, por lo que los cuerpos bloqueados no deben llamar a otros métodos desconocidos que pueden intentar volver a adquirir bloqueos (aunque puede pasar un sello a otros métodos que pueden usar o convertirlos). El uso de modos de bloqueo de lectura se basa en las secciones de código asociadas sin efectos secundarios. Las secciones de lectura optimista no validadas no pueden llamar a métodos que no se conocen para tolerar posibles incoherencias. Los sellos usan representaciones finitas y no son criptográficamente seguros (es decir, un sello válido puede ser adivinable). Los valores de stamp pueden reciclarse después (no antes de) un año de operación continua. Un sello mantenido sin uso o validación durante más de este período puede no validarse correctamente. StampedLocks son serializables, pero siempre se deserializan en estado desbloqueado inicial, por lo que no son útiles para el bloqueo remoto.

Al igual java.util.concurrent.Semaphore Semaphoreque , pero a diferencia de la mayoría Lock de las implementaciones, StampedLocks no tiene ninguna noción de propiedad. Los bloqueos adquiridos en un subproceso se pueden liberar o convertir en otro.

La directiva de programación de StampedLock no prefiere constantemente a los lectores sobre escritores o viceversa. Todos los métodos "try" son el mejor esfuerzo y no se ajustan necesariamente a ninguna directiva de programación o equidad. Una devolución cero de cualquier método "try" para adquirir o convertir bloqueos no contiene información sobre el estado del bloqueo; Una invocación posterior puede realizarse correctamente.

Dado que admite el uso coordinado en varios modos de bloqueo, esta clase no implementa directamente las Lock interfaces o ReadWriteLock . Sin embargo, un StampedLock se puede ver #asReadLock(), #asWriteLock()o #asReadWriteLock() en aplicaciones que solo requieren el conjunto asociado de funcionalidad.

<b>Sincronización de memoria.</b> Métodos con el efecto de bloquear correctamente en cualquier modo tienen los mismos efectos de sincronización de memoria que una <acción em>Lock</em>, tal como se describe en el capítulo 17 de <cita La especificación< del lenguaje Java/cita>>. Los métodos que se desbloquean correctamente en modo de escritura tienen los mismos efectos de sincronización de memoria que una <acción em>Unlock</em> . En los usos de lectura optimista, se garantiza que las acciones anteriores a la acción de desbloqueo del modo de escritura más reciente se produzcan antes de que las siguientes a tryOptimisticRead solo si una validación posterior devuelve true; de lo contrario, no hay ninguna garantía de que las lecturas entre tryOptimisticRead y validen la obtención de una instantánea coherente.

<b>Uso de ejemplo.</b> Lo siguiente ilustra algunas expresiones de uso en una clase que mantiene puntos bidimensionales simples. El código de ejemplo muestra algunas convenciones try/catch aunque no sean estrictamente necesarias aquí porque no se pueden producir excepciones en sus cuerpos.

{@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);
                }
              }
            }}

Agregado en la versión 1.8.

Documentación de Java para java.util.concurrent.locks.StampedLock.

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.

Constructores

StampedLock()

Crea un nuevo bloqueo, inicialmente en estado desbloqueado.

StampedLock(IntPtr, JniHandleOwnership)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

Propiedades

Class

Devuelve la clase en tiempo de ejecución de este Objectobjeto .

(Heredado de Object)
Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
IsReadLocked

Devuelve true si el bloqueo se mantiene actualmente no exclusivamente.

IsWriteLocked

Devuelve true si el bloqueo se mantiene actualmente exclusivamente.

JniIdentityHashCode

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
JniPeerMembers

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

PeerReference

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
ReadLockCount

Consulta el número de bloqueos de lectura que se mantienen para este bloqueo.

ThresholdClass

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

ThresholdType

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

Métodos

AsReadLock()

Devuelve una vista sin formato Lock de este StampedLock en la que el Lock#lock método se asigna a #readLocky de forma similar para otros métodos.

AsReadWriteLock()

Devuelve una ReadWriteLock vista de este StampedLock en la que el ReadWriteLock#readLock() método se asigna a #asReadLock()y ReadWriteLock#writeLock() a #asWriteLock().

AsWriteLock()

Devuelve una vista sin formato Lock de este StampedLock en la que el Lock#lock método se asigna a #writeLocky de forma similar para otros métodos.

Clone()

Crea y devuelve una copia de este objeto.

(Heredado de Object)
Dispose()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
Dispose(Boolean)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
Equals(Object)

Indica si algún otro objeto es "igual a" este.

(Heredado de Object)
GetHashCode()

Devuelve un valor de código hash del objeto.

(Heredado de Object)
IsLockStamp(Int64)

Indica si un sello representa la retención de un bloqueo.

IsOptimisticReadStamp(Int64)

Indica si un sello representa una lectura optimista correcta.

IsReadLockStamp(Int64)

Indica si un sello representa la retención de un bloqueo de forma no exclusiva.

IsWriteLockStamp(Int64)

Indica si un sello representa mantener un bloqueo exclusivamente.

JavaFinalize()

Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto .

(Heredado de Object)
Notify()

Activa un único subproceso que está esperando en el monitor de este objeto.

(Heredado de Object)
NotifyAll()

Activa todos los subprocesos que están esperando en el monitor de este objeto.

(Heredado de Object)
ReadLock()

No exclusivamente adquiere el bloqueo, bloqueando si es necesario hasta que esté disponible.

ReadLockInterruptibly()

No exclusivamente adquiere el bloqueo, que se bloquea si es necesario hasta que esté disponible o se interrumpa el subproceso actual.

SetHandle(IntPtr, JniHandleOwnership)

Establece la propiedad Handle.

(Heredado de Object)
ToArray<T>()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
ToString()

Devuelve una representación de cadena del objeto.

(Heredado de Object)
TryConvertToOptimisticRead(Int64)

Si el estado de bloqueo coincide con el sello especificado, de forma atómica, si el sello representa mantener un bloqueo, lo libera y devuelve una marca de observación.

TryConvertToReadLock(Int64)

Si el estado de bloqueo coincide con la marca especificada, realiza de forma atómica una de las siguientes acciones.

TryConvertToWriteLock(Int64)

Si el estado de bloqueo coincide con la marca especificada, realiza de forma atómica una de las siguientes acciones.

TryOptimisticRead()

Devuelve un sello que se puede validar más adelante o cero si está bloqueado exclusivamente.

TryReadLock()

No exclusivamente adquiere el bloqueo si está disponible inmediatamente.

TryReadLock(Int64, TimeUnit)

No exclusivamente adquiere el bloqueo si está disponible en el momento dado y el subproceso actual no se ha interrumpido.

TryUnlockRead()

Libera una suspensión del bloqueo de lectura si se mantiene, sin necesidad de un valor de marca.

TryUnlockWrite()

Libera el bloqueo de escritura si se mantiene, sin necesidad de un valor de marca.

TryWriteLock()

Adquiere exclusivamente el bloqueo si está disponible inmediatamente.

TryWriteLock(Int64, TimeUnit)

Adquiere exclusivamente el bloqueo si está disponible en el momento dado y el subproceso actual no se ha interrumpido.

Unlock(Int64)

Si el estado del bloqueo coincide con la marca especificada, libera el modo correspondiente del bloqueo.

UnlockRead(Int64)

Si el estado de bloqueo coincide con el sello especificado, libera el bloqueo no exclusivo.

UnlockWrite(Int64)

Si el estado del bloqueo coincide con el sello especificado, libera el bloqueo exclusivo.

UnregisterFromRuntime()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
Validate(Int64)

Devuelve true si el bloqueo no se ha adquirido exclusivamente desde la emisión del sello especificado.

Wait()

Hace que el subproceso actual espere hasta que se despierta, normalmente por ser em notificado/em> o <em>interrumpido</em>.<><

(Heredado de Object)
Wait(Int64)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
Wait(Int64, Int32)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
WriteLock()

Adquiere exclusivamente el bloqueo, bloqueando si es necesario hasta que esté disponible.

WriteLockInterruptibly()

Adquiere exclusivamente el bloqueo, que se bloquea si es necesario hasta que esté disponible o se interrumpa el subproceso actual.

Implementaciones de interfaz explícitas

IJavaPeerable.Disposed()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.DisposeUnlessReferenced()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.Finalized()

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.JniManagedPeerState

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

(Heredado de Object)

Métodos de extensión

JavaCast<TResult>(IJavaObject)

Realiza una conversión de tipos comprobados en tiempo de ejecución de Android.

JavaCast<TResult>(IJavaObject)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

GetJniTypeName(IJavaPeerable)

Bloqueo basado en funcionalidad con tres modos para controlar el acceso de lectura y escritura.

Se aplica a