Je voudrais ajouter quelques éléments en plus de la réponse de Bert F.
Locks
prend en charge diverses méthodes pour un contrôle de verrouillage plus fin, qui sont plus expressifs que les moniteurs implicites ( synchronized
verrous)
Un verrou fournit un accès exclusif à une ressource partagée: un seul thread à la fois peut acquérir le verrou et tous les accès à la ressource partagée nécessitent que le verrou soit acquis en premier. Cependant, certains verrous peuvent autoriser l'accès simultané à une ressource partagée, comme le verrou en lecture d'un ReadWriteLock.
Avantages du verrouillage sur la synchronisation à partir de la page de documentation
L'utilisation de méthodes ou d'instructions synchronisées permet d'accéder au verrou implicite du moniteur associé à chaque objet, mais oblige toutes les acquisitions et libérations de verrous à se produire de manière structurée par blocs
Les implémentations de verrouillage fournissent des fonctionnalités supplémentaires par rapport à l'utilisation de méthodes et d'instructions synchronisées en fournissant une tentative non bloquante d'acquérir un lock (tryLock())
, une tentative d'acquérir le verrou qui peut être interrompu ( lockInterruptibly()
et une tentative d'acquérir le verrou qui peut timeout (tryLock(long, TimeUnit))
.
Une classe Lock peut également fournir un comportement et une sémantique assez différents de ceux du verrouillage implicite du moniteur, comme l' ordre garanti, l'utilisation non réentrante ou la détection de blocage.
ReentrantLock : En termes simples, selon ma compréhension, ReentrantLock
permet à un objet de rentrer d'une section critique à une autre section critique. Puisque vous avez déjà verrouillé pour entrer dans une section critique, vous pouvez une autre section critique sur le même objet en utilisant le verrou actuel.
ReentrantLock
caractéristiques clés selon cet article
- Possibilité de verrouiller de manière interruptible.
- Possibilité de temporiser en attendant le verrouillage.
- Le pouvoir de créer un verrouillage équitable.
- API pour obtenir la liste des threads en attente de verrouillage.
- Flexibilité pour essayer de verrouiller sans bloquer.
Vous pouvez utiliser ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock
pour acquérir davantage de contrôle sur le verrouillage granulaire sur les opérations de lecture et d'écriture.
En dehors de ces trois ReentrantLocks, java 8 fournit un autre Lock
StampedLock:
Java 8 est livré avec un nouveau type de verrou appelé StampedLock qui prend également en charge les verrous de lecture et d'écriture, comme dans l'exemple ci-dessus. Contrairement à ReadWriteLock, les méthodes de verrouillage d'un StampedLock renvoient un tampon représenté par une valeur longue.
Vous pouvez utiliser ces tampons pour libérer un verrou ou pour vérifier si le verrou est toujours valide. De plus, les verrous estampés prennent en charge un autre mode de verrouillage appelé verrouillage optimiste.
Jetez un œil à cet article sur l'utilisation de différents types de verrous ReentrantLock
et StampedLock
.