Lenguaje

ReentrantReadWriteLock Clase

Definición

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
ReentrantReadWriteLock
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 con las propiedades de ordenación predeterminadas (nofair).

ReentrantReadWriteLock(Boolean)

Crea un nuevo ReentrantReadWriteLock con la directiva de equidad dada.

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 Objectobjeto .

(Heredado de Object)
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 true si este bloqueo tiene la equidad establecida en true.

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 ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
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 null si no es propiedad.

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 ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
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 ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
Equals(Object)

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
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 ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
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 ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.Finalized()

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

(Heredado de JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Implementación de compatibilidad con ReadWriteLock semántica similar a ReentrantLock.

Métodos de extensión

Nombre Description
GetJniTypeName(IJavaPeerable)

Obtiene el nombre JNI del tipo de la instancia self.

JavaAs<TResult>(IJavaPeerable)

Intente coerción self para escribir TResult, comprobando que la coerción es válida en el lado de Java.

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 ReadWriteLock semántica similar a ReentrantLock.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Intente coerción self para escribir TResult, comprobando que la coerción es válida en el lado de Java.

Se aplica a