web-dev-qa-db-fra.com

ReentrantReadWriteLock, quelle est la différence entre ReadLock et WriteLock

Ce que je sais, c'est que Writelock est comme synchronisé.

Readlock et Writelock s’affectent d’une manière ou d’une autre.

ReadLock semble ne pas pouvoir travailler seul.

28
jet

readLock.lock ();

Cela signifie que si tout autre thread est écriture (c'est-à-dire qu’il dispose d’un verrou en écriture), arrêtez-vous ici jusqu’à ce qu’aucun autre thread n’écrit.

Une fois que le verrou est accordé, aucun autre thread ne sera autorisé à écrire (c'est-à-dire prendre un verrou en écriture) jusqu'à ce que le verrou soit libéré.


writeLock.lock ();

Cela signifie que si un autre thread est en train de lire ou écrire, arrêtez-vous ici et attendez qu’aucun autre thread ne soit en train de lire ou d’écrire.

Une fois que le verrou est accordé, aucun autre thread ne sera autorisé à lire ou écrire (c'est-à-dire prendre un verrou en lecture ou en écriture) jusqu'à ce que le verrou soit libéré.


En combinant ces éléments, vous ne pouvez avoir accès en écriture qu'à un seul fil à la fois, mais autant de lecteurs que vous le souhaitez peuvent lire en même temps, sauf lorsqu'un fil est en cours d'écriture.

En d'autres termes. Chaque fois que vous voulez lire de la structure, utilisez un verrou lire. Chaque fois que vous voulez écrire, utilisez un verrou écrire. De cette façon, chaque fois qu'une écriture survient, personne ne lit (vous pouvez imaginer que vous avez un accès exclusif), mais il peut y avoir beaucoup de lecteurs qui lisent en même temps tant que personne n'écrit.

85
OldCurmudgeon

La documentation de ReadWriteLock indique clairement ceci:

Un ReadWriteLock maintient une paire de verrous associés, l'un pour les opérations en lecture seule et l'autre pour l'écriture. Le verrou de lecture peut être maintenu simultanément par plusieurs unités de lecture, tant qu'il n'y a pas d'écrivain. Le verrou en écriture est exclusif.

Vous pouvez donc avoir plusieurs lecteurs à la fois, mais un seul auteur - et cet auteur empêchera également les lecteurs de lire. Ceci est utile si vous avez une ressource qui peut être lue en toute sécurité à partir de plusieurs threads et où la lecture est beaucoup plus courante que l'écriture, mais lorsque la ressource n'est pas réellement en lecture seule. (S'il n'y a pas d'écrivain et que la lecture est sécurisée, aucun verrou n'est nécessaire.)

17
Jon Skeet

Lorsqu'un thread acquiert une WriteLock, aucun autre thread ne peut acquérir la ReadLock ni la WriteLock de la même instance de ReentrantReadWriteLock, à moins que ce thread ne lâche le verrou. Cependant, plusieurs threads peuvent acquérir la ReadLock en même temps.

6
Eng.Fouad

À l'aide de ReadWriteLock, vous pouvez améliorer les performances d'une application dans laquelle plus de lectures sont effectuées sur un objet partagé que d'écritures.

ReadWriteLock maintient deux verrous pour les opérations de lecture et d’écriture. Un seul verrou en lecture ou en écriture peut être acquis en même temps. Mais plusieurs threads peuvent simultanément acquérir un verrou de lecture, à condition que le verrou en écriture ne soit acquis par aucun thread.

ReentrantReadWriteLock est une implémentation de ReadWriteLock. Il attribue un verrou en écriture au thread le plus longtemps en attente si plusieurs threads n'attendent pas le verrou en lecture. Si plusieurs threads attendent le verrou de lecture, ce dernier leur est accordé.

Un lecteur qui a acquis un verrou de lecture peut réacquérir un verrou de lecture. De même, un rédacteur peut obtenir un verrou d'écriture et peut également obtenir un verrou de lecture.

Voir http://www.zoftino.com/Java-concurrency-lock-and-condition-examples

0
Arnav Rao