ReentrantReadWriteLock Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Implémentation de la prise en charge de ReadWriteLock la sémantique similaire à 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
- Héritage
- Attributs
- Implémente
Remarques
Implémentation de la prise en charge de ReadWriteLock la sémantique similaire à ReentrantLock.
Cette classe a les propriétés suivantes :
<ul><li><b>Acquisition order</b>
Cette classe n’impose pas d’ordre de préférence de lecteur ou d’enregistreur pour l’accès verrouillé. Toutefois, elle prend en charge une stratégie facultative <d’équité></em>.
<dl><dt><b>Mode non équitable (valeur par défaut)</b><dd>Lorsqu’il est construit comme non équitable (valeur par défaut), l’ordre d’entrée du verrou de lecture et d’écriture n’est pas spécifié, soumis à des contraintes de réentrance. Un verrou non équitable qui est continuellement soutenu peut reporter indéfiniment un ou plusieurs threads de lecteur ou d’enregistreur, mais aura normalement un débit plus élevé qu’un verrou équitable.
<dt><b>Mode fair</b><dd>Lorsqu’il est construit comme équitable, les threads prétendent entrer à l’aide d’une stratégie d’ordre d’arrivée approximative. Lorsque le verrou actuellement conservé est libéré, soit le thread d’écriture unique en attente le plus long soit affecté au verrou d’écriture, soit s’il existe un groupe de threads de lecteur en attente plus long que tous les threads d’enregistreur en attente, ce groupe reçoit le verrou de lecture.
Un thread qui tente d’acquérir un verrou de lecture équitable (sans reentrantly) bloque si le verrou d’écriture est conservé ou s’il existe un thread d’enregistreur en attente. Le thread n’acquiert pas le verrou de lecture tant que le thread d’écriture en attente le plus ancien n’a pas acquis et libéré le verrou d’écriture. Bien sûr, si un enregistreur en attente abandonne son attente, laissant un ou plusieurs threads de lecteur en tant que serveurs les plus longs dans la file d’attente avec le verrou d’écriture libre, ces lecteurs reçoivent le verrou de lecture.
Un thread qui tente d’acquérir un verrou d’écriture équitable (sans reentrantly) se bloque, sauf si le verrou de lecture et le verrou d’écriture sont libres (ce qui implique qu’il n’y a pas de threads en attente). (Notez que les méthodes et ReadLock#tryLock() non bloquantes WriteLock#tryLock() ne respectent pas ce paramètre équitable et acquiert immédiatement le verrou s’il est possible, indépendamment des threads en attente.) </dl>
<li><b>Reentrancy</b>
Ce verrou permet aux lecteurs et aux écrivains de réacquire les verrous de lecture ou d’écriture dans le style d’un ReentrantLock. Les lecteurs non réentrants ne sont pas autorisés tant que tous les verrous d’écriture détenus par le thread d’écriture n’ont pas été libérés.
En outre, un enregistreur peut acquérir le verrou de lecture, mais pas inversement. Parmi les autres applications, la réentrance peut être utile lorsque des verrous d’écriture sont conservés pendant les appels ou rappels aux méthodes qui effectuent des lectures sous des verrous de lecture. Si un lecteur tente d’acquérir le verrou d’écriture, il ne réussira jamais.
<li><b>Verrouillage rétrogradation</b>
La réentrance autorise également la rétrogradation du verrou d’écriture vers un verrou de lecture, en acquérant le verrou d’écriture, puis en libérant le verrou d’écriture. Toutefois, la mise à niveau d’un verrou de lecture vers le verrou d’écriture n’est <pas> b</b> possible.
<li><b>Interruption de l’acquisition< de verrou/b>
Le verrou de lecture et le verrou d’écriture prennent tous les deux en charge l’interruption pendant l’acquisition du verrou.
<support li><b>Condition</b>
Le verrou d’écriture fournit une Condition implémentation qui se comporte de la même façon, en ce qui concerne le verrou d’écriture, comme l’implémentation Condition fournie pour ReentrantLock#newConditionReentrantLock. Cela Condition peut, bien sûr, être utilisé uniquement avec le verrou d’écriture.
Le verrou de lecture ne prend pas en charge une Condition et readLock().newCondition() lève UnsupportedOperationException.
<li><b>Instrumentation</b>
Cette classe prend en charge les méthodes pour déterminer si les verrous sont conservés ou soutenus. Ces méthodes sont conçues pour surveiller l’état du système, et non pour le contrôle de synchronisation. </ul>
La sérialisation de cette classe se comporte de la même façon que les verrous intégrés : un verrou désérialisé est dans l’état déverrouillé, quel que soit son état lors de la sérialisation.
<b>Exemples d’utilisations.</b> Voici un croquis de code montrant comment effectuer une rétrogradation des verrous après la mise à jour d’un cache (la gestion des exceptions est particulièrement délicate lors de la gestion de plusieurs verrous de manière non imbriquée) :
{@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 peut être utilisé pour améliorer la concurrence dans certaines utilisations de certains types de collections. Cela vaut généralement la peine d’être utile uniquement lorsque les collections sont censées être volumineuses, accessibles par plus de threads de lecture que de threads d’écriture, et impliquent des opérations avec une surcharge qui dépasse la surcharge de synchronisation. Par exemple, voici une classe utilisant un TreeMap qui est censé être volumineux et accessible simultanément.
{@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(); }
}
}}
<Notes> d’implémentation h2</h2>
Ce verrou prend en charge un maximum de 65535 verrous d’écriture récursifs et 65535 verrous de lecture. Les tentatives de dépassement de ces limites entraînent Error des levées de méthodes de verrouillage.
Ajouté à la version 1.5.
Java documentation pour java.util.concurrent.locks.ReentrantReadWriteLock.
Les parties de cette page sont des modifications basées sur le travail créé et partagé par Android Open Source et utilisées en fonction des termes décrits dans la Creative Commons 2.5 Attribution License.
Constructeurs
| Nom | Description |
|---|---|
| ReentrantReadWriteLock() |
Crée un nouveau |
| ReentrantReadWriteLock(Boolean) |
Crée une nouvelle |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
Constructeur utilisé lors de la création de représentations managées d’objets JNI ; appelée par le runtime. |
Propriétés
| Nom | Description |
|---|---|
| Class |
Retourne la classe runtime de ce |
| Handle |
Handle de l’instance Android sous-jacente. (Hérité de Object) |
| HasQueuedThreads |
Interroge si des threads attendent d’acquérir le verrou de lecture ou d’écriture. |
| IsFair |
Retourne |
| IsWriteLocked |
Interroge si le verrou d’écriture est conservé par n’importe quel thread. |
| IsWriteLockedByCurrentThread |
Interroge si le verrou d’écriture est conservé par le thread actuel. |
| JniIdentityHashCode |
Obtient le code de hachage d’identité affecté à cet homologue Java par le runtime d’interopérabilité. (Hérité de Object) |
| JniManagedPeerState |
Implémentation de la prise en charge de |
| JniPeerMembers |
Obtient les métadonnées JNI utilisées pour appeler les membres de cet homologue Java. |
| Owner |
Retourne le thread qui possède actuellement le verrou d’écriture, ou |
| PeerReference |
Obtient la référence d’objet JNI pour cet homologue Java. (Hérité de Object) |
| QueuedReaderThreads |
Retourne une collection contenant des threads qui peuvent attendre l’acquisition du verrou de lecture. |
| QueuedThreads |
Retourne une collection contenant des threads qui peuvent être en attente d’acquérir le verrou de lecture ou d’écriture. |
| QueuedWriterThreads |
Retourne une collection contenant des threads qui peuvent attendre d’acquérir le verrou d’écriture. |
| QueueLength |
Retourne une estimation du nombre de threads en attente d’acquérir le verrou de lecture ou d’écriture. |
| ReadHoldCount |
Interroge le nombre de conservations de lecture réentrantes sur ce verrou par le thread actuel. |
| ReadLockCount |
Interroge le nombre de verrous de lecture conservés pour ce verrou. |
| ThresholdClass |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
| ThresholdType |
Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code. |
| WriteHoldCount |
Interroge le nombre de conservations d’écriture réentrantes sur ce verrou par le thread actuel. |
Méthodes
| Nom | Description |
|---|---|
| Clone() |
Crée et retourne une copie de cet objet. (Hérité de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Implémentation de la prise en charge de |
| Dispose() |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| Dispose(Boolean) |
Libère les ressources détenues par cet homologue Java. (Hérité de Object) |
| DisposeUnlessReferenced() |
Implémentation de la prise en charge de |
| Equals(Object) |
Implémentation de la prise en charge de |
| Equals(Object) |
Indique si un autre objet est « égal à » celui-ci. (Hérité de Object) |
| GetHashCode() |
Retourne une valeur de code de hachage pour l’objet. (Hérité de Object) |
| GetWaitingThreads(ICondition) |
Retourne une collection contenant ces threads qui peuvent être en attente sur la condition donnée associée au verrou d’écriture. |
| GetWaitQueueLength(ICondition) |
Retourne une estimation du nombre de threads en attente sur la condition donnée associée au verrou d’écriture. |
| HasQueuedThread(Thread) |
Interroge si le thread donné attend d’acquérir le verrou de lecture ou d’écriture. |
| HasWaiters(ICondition) |
Interroge si les threads attendent la condition donnée associée au verrou d’écriture. |
| JavaFinalize() |
Appelé par le garbage collector sur un objet lorsque le garbage collection détermine qu’il n’y a plus de références à l’objet. (Hérité de Object) |
| Notify() |
Réveille un thread unique qui attend le moniteur de cet objet. (Hérité de Object) |
| NotifyAll() |
Réveille tous les threads qui attendent le moniteur de cet objet. (Hérité de Object) |
| ReadLock() |
Retourne le verrou utilisé pour la lecture. |
| SetHandle(IntPtr, JniHandleOwnership) |
Définit la propriété Handle. (Hérité de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Implémentation de la prise en charge de |
| ToArray<T>() |
Crée un tableau managé à partir de ce wrapper de tableau Java. (Hérité de Object) |
| ToString() |
Retourne une représentation de chaîne de l'objet. (Hérité de Object) |
| UnregisterFromRuntime() |
Annule l’inscription de cet homologue Java à partir du runtime d’interopérabilité. (Hérité de Object) |
| Wait() |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti par em ou><em>interrompu</em>.<> (Hérité de Object) |
| Wait(Int64, Int32) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
| Wait(Int64) |
Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée. (Hérité de Object) |
| WriteLock() |
Retourne le verrou utilisé pour l’écriture. |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| IJavaPeerable.Disposed() |
Implémentation de la prise en charge de |
| IJavaPeerable.Finalized() |
Implémentation de la prise en charge de |
| IJavaPeerable.JniObjectReferenceControlBlock |
Implémentation de la prise en charge de |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Implémentation de la prise en charge de |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Implémentation de la prise en charge de |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Implémentation de la prise en charge de |
| IJavaPeerable.UnregisterFromRuntime() |
Implémentation de la prise en charge de |
Méthodes d’extension
| Nom | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtient le nom JNI du type de l’instance |
| JavaAs<TResult>(IJavaPeerable) |
Essayez de forcer |
| JavaCast<TResult>(IJavaObject) |
Effectue une conversion de type vérifiée par le runtime Android. |
| JavaCast<TResult>(IJavaObject) |
Implémentation de la prise en charge de |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Essayez de forcer |