ReentrantReadWriteLock 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í.
Implementación de compatibilidad con ReadWriteLock semántica similar a 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
- Herencia
- Atributos
- Implementaciones
Comentarios
Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.
Esta clase tiene las siguientes propiedades:
<ul><li><b>Adquisición order</b>
Esta clase no impone un orden de preferencia de lector o escritor para el acceso de bloqueo. Sin embargo, admite una directiva opcional <em>fairness</em> .
<dl><dt><b>Modo no justo (valor predeterminado)</b><dd>Cuando se construye como no justo (el valor predeterminado), el orden de entrada al bloqueo de lectura y escritura no está especificado, sujeto a restricciones de reentrancia. Un bloqueo no feriado que se sostiene continuamente puede posponer indefinidamente uno o varios subprocesos de lector o escritor, pero normalmente tendrá un mayor rendimiento que un bloqueo justo.
<dt><b>Fair mode</b><dd>Cuando se construye como justo, los subprocesos sostienen la entrada mediante una directiva de orden de llegada aproximadamente. Cuando se libera el bloqueo que se mantiene actualmente, se asignará el bloqueo de escritura más largo a la espera, o si hay un grupo de subprocesos de lector que esperan más tiempo que todos los subprocesos de escritor en espera, ese grupo se asignará al bloqueo de lectura.
Un subproceso que intenta adquirir un bloqueo de lectura justo (no reentrantmente) se bloqueará si se mantiene el bloqueo de escritura o si hay un subproceso de escritor en espera. El subproceso no adquirirá el bloqueo de lectura hasta después de que el subproceso de escritura más antiguo actualmente en espera haya adquirido y liberado el bloqueo de escritura. Por supuesto, si un escritor en espera abandona su espera, dejando uno o más subprocesos de lector como los esperadores más largos de la cola con el bloqueo de escritura libre, a esos lectores se les asignará el bloqueo de lectura.
Un subproceso que intenta adquirir un bloqueo de escritura justo (no reentrantmente) se bloqueará a menos que el bloqueo de lectura y el bloqueo de escritura estén libres (lo que implica que no hay subprocesos en espera). (Tenga en cuenta que los métodos y ReadLock#tryLock() sin bloqueo WriteLock#tryLock() no respetan esta configuración justa y adquirirán inmediatamente el bloqueo si es posible, independientemente de los subprocesos en espera). </dl>
<li><b>Reentrancy</b>
Este bloqueo permite a los lectores y escritores volver a adquirir bloqueos de lectura o escritura en el estilo de .ReentrantLock No se permiten lectores no reentrantes hasta que se hayan liberado todos los bloqueos de escritura mantenidos por el subproceso de escritura.
Además, un escritor puede adquirir el bloqueo de lectura, pero no viceversa. Entre otras aplicaciones, la reentrada puede ser útil cuando se mantienen bloqueos de escritura durante llamadas o devoluciones de llamada a métodos que realizan lecturas bajo bloqueos de lectura. Si un lector intenta adquirir el bloqueo de escritura, nunca se realizará correctamente.
<li><b>Bloqueo degradado</b>
Reentrancy también permite degradar desde el bloqueo de escritura a un bloqueo de lectura, mediante la adquisición del bloqueo de escritura, el bloqueo de lectura y, a continuación, la liberación del bloqueo de escritura. Sin embargo, la actualización de un bloqueo de lectura al bloqueo de escritura es <b>no< b/b> posible.
<li><b>Interrupción de la adquisición< de bloqueos/b>
El bloqueo de lectura y el bloqueo de escritura admiten la interrupción durante la adquisición de bloqueos.
<li><b>Condition support</b>
El bloqueo de escritura proporciona una Condition implementación que se comporta de la misma manera, con respecto al bloqueo de escritura, como la Condition implementación proporcionada por ReentrantLock#newCondition para ReentrantLock. Esto Condition solo se puede usar con el bloqueo de escritura.
El bloqueo de lectura no admite y ConditionreadLock().newCondition() produce UnsupportedOperationException.
<li><b>Instrumentación</b>
Esta clase admite métodos para determinar si los bloqueos se mantienen o se sostienen. Estos métodos están diseñados para supervisar el estado del sistema, no para el control de sincronización. </ul>
La serialización de esta clase se comporta de la misma manera que los bloqueos integrados: un bloqueo deserializado está en estado desbloqueado, independientemente de su estado cuando se serialice.
<b>Usos de ejemplo.</b> Este es un boceto de código que muestra cómo realizar la degradación de bloqueo después de actualizar una caché (el control de excepciones es especialmente complicado al controlar varios bloqueos de forma no anidada):
{@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 se puede usar para mejorar la simultaneidad en algunos usos de algunos tipos de colecciones. Por lo general, esto vale la pena solo cuando se espera que las colecciones sean grandes, a las que acceden más subprocesos de lector que los subprocesos de escritor, y conllevan operaciones con sobrecarga que superan la sobrecarga de sincronización. Por ejemplo, esta es una clase que usa un objeto TreeMap al que se espera que se tenga acceso de forma grande y simultánea.
{@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>Notas< de implementación/h2>
Este bloqueo admite un máximo de 65535 bloqueos de escritura recursivos y 65535 bloqueos de lectura. Los intentos de superar estos límites provocan Error que se produzcan métodos de bloqueo.
Agregado en 1.5.
Java documentación para java.util.concurrent.locks.ReentrantReadWriteLock.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.
Constructores
| Nombre | Description |
|---|---|
| ReentrantReadWriteLock() |
Crea un nuevo |
| ReentrantReadWriteLock(Boolean) |
Crea un nuevo |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el tiempo de ejecución. |
Propiedades
| Nombre | Description |
|---|---|
| Class |
Devuelve la clase en tiempo de ejecución de este |
| Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
| HasQueuedThreads |
Consulta si algún subproceso está esperando adquirir el bloqueo de lectura o escritura. |
| IsFair |
Devuelve |
| IsWriteLocked |
Consulta si cualquier subproceso mantiene el bloqueo de escritura. |
| IsWriteLockedByCurrentThread |
Consulta si el subproceso actual mantiene el bloqueo de escritura. |
| JniIdentityHashCode |
Obtiene el código hash de identidad asignado a este Java del mismo nivel por el tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| JniManagedPeerState |
Implementación de compatibilidad con |
| JniPeerMembers |
Obtiene los metadatos de JNI usados para invocar miembros de este Java del mismo nivel. |
| Owner |
Devuelve el subproceso que posee actualmente el bloqueo de escritura o |
| PeerReference |
Obtiene la referencia de objeto JNI para este Java del mismo nivel. (Heredado de Object) |
| QueuedReaderThreads |
Devuelve una colección que contiene subprocesos que pueden estar esperando adquirir el bloqueo de lectura. |
| QueuedThreads |
Devuelve una colección que contiene subprocesos que pueden estar esperando adquirir el bloqueo de lectura o escritura. |
| QueuedWriterThreads |
Devuelve una colección que contiene subprocesos que pueden estar esperando adquirir el bloqueo de escritura. |
| QueueLength |
Devuelve una estimación del número de subprocesos que esperan adquirir el bloqueo de lectura o escritura. |
| ReadHoldCount |
Consulta el número de reentrantes de lectura en este bloqueo por el subproceso actual. |
| ReadLockCount |
Consulta el número de bloqueos de lectura que se mantienen para este bloqueo. |
| ThresholdClass |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
| ThresholdType |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
| WriteHoldCount |
Consulta el número de reentrantes de escritura en este bloqueo por el subproceso actual. |
Métodos
| Nombre | Description |
|---|---|
| Clone() |
Crea y devuelve una copia de este objeto. (Heredado de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Implementación de compatibilidad con |
| Dispose() |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| Dispose(Boolean) |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| DisposeUnlessReferenced() |
Implementación de compatibilidad con |
| Equals(Object) |
Implementación de compatibilidad con |
| Equals(Object) |
Indica si algún otro objeto es "igual a" este. (Heredado de Object) |
| GetHashCode() |
Devuelve un valor de código hash para el objeto . (Heredado de Object) |
| GetWaitingThreads(ICondition) |
Devuelve una colección que contiene esos subprocesos que pueden estar esperando la condición dada asociada al bloqueo de escritura. |
| GetWaitQueueLength(ICondition) |
Devuelve una estimación del número de subprocesos en espera de la condición dada asociada al bloqueo de escritura. |
| HasQueuedThread(Thread) |
Consulta si el subproceso dado está esperando adquirir el bloqueo de lectura o escritura. |
| HasWaiters(ICondition) |
Consulta si algún subproceso está esperando la condición dada asociada al bloqueo de escritura. |
| JavaFinalize() |
Obsoletos.
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() |
Devuelve el bloqueo usado para leer. |
| SetHandle(IntPtr, JniHandleOwnership) |
Establece la propiedad Handle. (Heredado de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Implementación de compatibilidad con |
| ToArray<T>() |
Crea una matriz administrada a partir de este contenedor de matriz Java. (Heredado de Object) |
| ToString() |
Devuelve una representación de cadena del objeto. (Heredado de Object) |
| UnregisterFromRuntime() |
Anula el registro de este Java del mismo nivel del tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| 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, 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) |
| 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) |
| WriteLock() |
Devuelve el bloqueo usado para escribir. |
Implementaciones de interfaz explícitas
| Nombre | Description |
|---|---|
| IJavaPeerable.Disposed() |
Implementación de compatibilidad con |
| IJavaPeerable.Finalized() |
Implementación de compatibilidad con |
| IJavaPeerable.JniObjectReferenceControlBlock |
Implementación de compatibilidad con |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Implementación de compatibilidad con |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Implementación de compatibilidad con |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Implementación de compatibilidad con |
| IJavaPeerable.UnregisterFromRuntime() |
Implementación de compatibilidad con |
Métodos de extensión
| Nombre | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtiene el nombre JNI del tipo de la instancia |
| JavaAs<TResult>(IJavaPeerable) |
Intente coerción |
| JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
| JavaCast<TResult>(IJavaObject) |
Implementación de compatibilidad con |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Intente coerción |