La gestion de l'accès aux ressources partagées est importante en programmation simultanée pour garantir la cohérence des données. Le mot clé synchronisé traditionnel manque de flexibilité pour des scénarios complexes comme l'équité, l'acquisition immédiate d'un verrou, l'attente d'un moment précis pour acquérir le verrou, etc. Les API Lock, ReadWriteLock et StampedLock sont introduites dans Java 1.5 pour résoudre ces limitations et offrir un grand contrôle aux développeurs pour gérer accès aux ressources partagées. Ils font partie du package java.util.concurrent.
API de verrouillage
Lock API est une interface et fournit les méthodes ci-dessous pour gérer la synchronisation des threads.
- void lock() Il est utilisé pour acquérir le verrou. Si le verrou n'est pas disponible, le fil sera bloqué jusqu'à ce que le verrou soit acquis.
- void lockInterruptably() C'est la même chose que lock(), mais ce fil peut être interrompu.
- boolean tryLock() Renvoie vrai si le verrou est acquis ; sinon, faux. Le fil ne sera pas bloqué si le verrou n'est pas accordé.
- boolean tryLock (long timeout, unité TimeUnit) C'est la même chose que tryLock() mais attend uniquement une durée spécifiée.
- void unlock() Libère le verrou.
- Condition newCondition() Permet à un thread d'attendre qu'une condition se produise lors de l'exécution de la partie critique.
ReentrantLock
- La classe ReentrantLock implémente l'interface Lock.
- Un verrou réentrant permet à un thread d'acquérir un verrou plusieurs fois et de le libérer plusieurs fois.
- Si vous souhaitez une politique d'équité, utilisez le constructeur paramétré de ReentrantLock.
- Si l'équité est activée, il garantit que le thread en attente le plus long a accès au verrou.
- Utilisez enfin le bloc pour libérer le verrou afin d'éviter une situation de blocage.
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
API ReadWriteLock
L'API ReadWriteLock est une interface et maintient une paire de verrous pour maintenir les scénarios de lecture et d'écriture. Le verrou de lecture peut être détenu simultanément par plusieurs threads s'il n'y a pas d'écrivains. Le verrou en écriture est exclusif.
- Lock readLock() - Renvoie le verrou utilisé pour la lecture.
- Lock writeLock() - Renvoie le verrou utilisé pour l'écriture.
Règles clés
- Si vous disposez d'un verrou en lecture, vous ne pouvez pas acquérir de verrou en écriture.
- Si vous disposez d'un verrou en écriture, vous ne pouvez acquérir un verrou en lecture dans aucun autre fil de discussion.
- Si vous disposez d'un verrou en écriture, vous pouvez en acquérir un autre dans le même fil de discussion.
- Un verrou en écriture est autorisé lorsqu'aucun autre verrou en lecture ou en écriture n'est actif.
- En attendant un verrou en écriture, aucun nouveau verrou en lecture provenant d'autres threads n'est autorisé.
RéentrantReadWriteLock
- La classe ReentrantReadWriteLock implémente l'interface ReadWriteLock.
- Utile si nous avons plus de lecture que d'écriture.
Exemple : dans la communication par micro-service, supposons que le service B attend un JWT du service A. JWT est généré par le service A et peut être mis en cache pendant quelques minutes. Dans ces scénarios, ReentrantReadWriteLock sera plus utile. Nous pouvons renouveler le token s'il est expiré ou sur le point d'expirer. Je n'acquiers pas de verrou de lecture ici pour éviter la famine en lecture.
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
API StampedLock
StampedLock a été introduit dans Java 8 et c'est une classe. Il prend en charge trois modes de verrouillage et renvoie un tampon utilisé pour déverrouiller le verrou. Il permet la mise à niveau du verrouillage.
- Read Lock Permet à plusieurs threads de lire simultanément.
- Write Lock Renvoie un verrou utilisé pour l'écriture.
- Verrouillage de lecture optimiste Permet à un thread de lire sans acquérir un verrou de lecture traditionnel, ce qui améliore les performances en évitant les conflits.
- long writeLock() Acquiert le verrou exclusif, le bloquant si nécessaire jusqu'à ce qu'il soit disponible.
- void unlockWrite(long stamp) Libère le verrou en écriture.
- long readLock() Acquiert le verrou de lecture, bloque si un verrou d'écriture est en cours.
- void unlockRead(long stamp) Libère le verrou de lecture.
- long tryOptimisticRead() Renvoie un tampon qui peut être validé ultérieurement, ou zéro s'il est exclusivement verrouillé.
- boolean validate(long stamp) Renvoie vrai si le verrou n'a pas été acquis exclusivement (verrouillage en écriture) depuis l'émission du tampon donné ; sinon, faux.
- long tryConvertToWriteLock(long stamp) Met à niveau un verrou de lecture ou optimiste vers un verrou d'écriture. Bloque jusqu'à ce qu'il soit disponible.
Points clés :
- Il n'est pas réentrant, ce qui signifie qu'un thread détenant un verrou ne peut pas l'acquérir à nouveau.
- Il ne prend pas en charge les conditions.
- Cela ne soutient pas l’équité.
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
Exemple de lecture optimiste. Cela permet à un thread de lire sans acquérir un verrou de lecture traditionnel, ce qui améliore les performances en évitant les conflits de verrouillage. Si un verrou en écriture est acquis après avoir acquis un temps de verrouillage en lecture optimiste, validate() renverra false sinon ce sera vrai.
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
Bon codage et apprentissage !!!
Veuillez laisser un commentaire si vous avez des questions.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

L'article discute de la création et de l'utilisation de bibliothèques Java personnalisées (fichiers JAR) avec un versioning approprié et une gestion des dépendances, à l'aide d'outils comme Maven et Gradle.

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Cet article explique l'invocation de la méthode distante de Java (RMI) pour la construction d'applications distribuées. Il détaille la définition de l'interface, la mise en œuvre, la configuration du registre et l'invocation côté client, résolvant des défis tels que les problèmes de réseau et la sécurité.

Cet article détaille l'API Socket de Java pour la communication réseau, couvrant la configuration du serveur client, la gestion des données et les considérations cruciales telles que la gestion des ressources, la gestion des erreurs et la sécurité. Il explore également les techniques d'optimisation des performances, je

Cet article détaille la création de protocoles de réseautage Java personnalisés. Il couvre la définition du protocole (structure de données, cadrage, gestion des erreurs, versioning), implémentation (utilisant des sockets), sérialisation des données et meilleures pratiques (efficacité, sécurité, maintien


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

SublimeText3 Linux nouvelle version
Dernière version de SublimeText3 Linux

SublimeText3 version chinoise
Version chinoise, très simple à utiliser