StampedLock Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- 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 Semaphore
que , 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 |
Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
IsReadLocked |
Devuelve |
IsWriteLocked |
Devuelve |
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 |
AsReadWriteLock() |
Devuelve una |
AsWriteLock() |
Devuelve una vista sin formato |
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. |