Maison >Java >javaDidacticiel >Présentation de l'API Lock en Java
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.
Lock API est une interface et fournit les méthodes ci-dessous pour gérer la synchronisation des threads.
ReentrantLock
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
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.
Règles clés
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(); } }
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.
Points clés :
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!