StampedLock et lectures optimistes
Appliquez le mode de lecture optimiste de StampedLock aux charges de travail à haut débit dominées par les lectures.
StampedLock et lectures optimistes est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Qu’est-ce que StampedLock ?
Introduit dans Java 8, StampedLock étend les concepts de ReadWriteLock avec un mode supplémentaire de lecture optimiste. Les opérations renvoient une longue estampille utilisée pour libérer le verrou ou valider la lecture optimiste.
import java.util.concurrent.locks.*;
StampedLock sl = new StampedLock();
// Exclusive write:
long stamp = sl.writeLock();
try {
// write data
} finally {
sl.unlockWrite(stamp);
}
// Shared read:
stamp = sl.readLock();
try {
// read data
} finally {
sl.unlockRead(stamp);
}Mode de lecture optimiste
La lecture optimiste n’acquiert aucun verrou : elle obtient simplement une estampille. Après la lecture, validez l’estampille. Si la validation échoue (un rédacteur est intervenu), repliez-vous sur un véritable verrou de lecture :
StampedLock sl2 = new StampedLock();
double x = 0, y = 0;
// Try optimistic read first:
long stamp = sl2.tryOptimisticRead();
double localX = x, localY = y; // read values
if (!sl2.validate(stamp)) {
// A write occurred — fall back to read lock
stamp = sl2.readLock();
try {
localX = x;
localY = y;
} finally {
sl2.unlockRead(stamp);
}
}
// use localX and localYExemple complet de point 2D
Exemple classique de StampedLock — un point 2D avec des lectures optimistes :
class Point {
private double x, y;
private final StampedLock lock = new StampedLock();
void move(double dx, double dy) {
long stamp = lock.writeLock();
try { x += dx; y += dy; }
finally { lock.unlockWrite(stamp); }
}
double distanceFromOrigin() {
long stamp = lock.tryOptimisticRead();
double cx = x, cy = y;
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try { cx = x; cy = y; }
finally { lock.unlockRead(stamp); }
}
return Math.sqrt(cx * cx + cy * cy);
}
}Conversion de verrouillage
StampedLock prend en charge la conversion entre les modes de verrouillage :
StampedLock sl3 = new StampedLock();
// Read → Write upgrade attempt:
long readStamp = sl3.readLock();
long writeStamp = sl3.tryConvertToWriteLock(readStamp);
if (writeStamp != 0) {
// Successfully upgraded!
// ... write ...
sl3.unlockWrite(writeStamp);
} else {
// Upgrade failed — release read and reacquire write
sl3.unlockRead(readStamp);
writeStamp = sl3.writeLock();
// ... write ...
sl3.unlockWrite(writeStamp);
}Quand les lectures optimistes sont particulièrement utiles
Les lectures optimistes sont particulièrement efficaces lorsque :
- Les lectures sont beaucoup plus fréquentes que les écritures
- L’instantané des données tient dans quelques variables locales (aucune allocation d’objet)
- La contention lors des écritures est faible (la validation échoue rarement)
Si les écritures sont fréquentes, les lectures optimistes se replient sans cesse sur des verrous de lecture complets, sans apporter de bénéfice.
StampedLock et ReadWriteLock
Principales différences :
- StampedLock : ajoute les lectures optimistes ; NOT réentrant ; ne prend pas en charge les variables Condition
- ReentrantReadWriteLock : réentrant ; prend en charge les variables Condition ; aucun mode optimiste
StampedLock est plus rapide lorsque la contention lors des écritures est faible. ReentrantReadWriteLock est plus sûr et offre davantage de fonctionnalités.
StampedLock n’est NOT pas réentrant
Contrairement à ReentrantLock, StampedLock n’est NOT pas réentrant. Un fil d’exécution qui tente d’acquérir un mode qu’il détient déjà provoquera un interblocage :
StampedLock sl4 = new StampedLock();
long s1 = sl4.readLock();
// DO NOT: sl4.readLock() again — deadlocks with non-reentrant!tryWriteLock et tryReadLock
Les tentatives d’acquisition non bloquantes renvoient 0 en cas d’échec :
StampedLock sl5 = new StampedLock();
long stamp = sl5.tryWriteLock();
if (stamp != 0) {
try {
System.out.println("Got write lock");
} finally {
sl5.unlockWrite(stamp);
}
} else {
System.out.println("Write lock unavailable");
}Utiliser as ReadWriteLock
StampedLock peut renvoyer une vue sous la forme d’un ReadWriteLock standard pour assurer la compatibilité :
StampedLock sl6 = new StampedLock();
Lock readLock = sl6.asReadLock();
Lock writeLock = sl6.asWriteLock();
ReadWriteLock rwView = sl6.asReadWriteLock();
// These provide standard Lock interface without optimistic modeIntuition concernant les mesures de performances
Les résultats des mesures montrent généralement :
- Très forte prédominance des lectures (99 % de lectures) : StampedLock > ReadWriteLock > synchronized
- Charge mixte (70 % de lectures) : ReadWriteLock ≈ StampedLock
- Prédominance des écritures : synchronized ou ReentrantLock l’emporte souvent (coût moindre)
Mesurez toujours les performances avec des charges réalistes avant d’optimiser.
Invalidité de l’estampille après déverrouillage
Après avoir libéré un verrou avec une estampille, cette estampille devient invalide. L’utilisation d’une ancienne estampille après le déverrouillage entraîne un comportement indéfini — capturez toujours une nouvelle estampille lors de chaque acquisition de verrou.
StampedLock sl7 = new StampedLock();
long stamp = sl7.writeLock();
sl7.unlockWrite(stamp);
// stamp is now invalid — don't use it:
// sl7.unlockWrite(stamp); // throws IllegalMonitorStateException or corrupts stateVérification rapide
Une lecture optimiste avec tryOptimisticRead() suivie de validate(stamp) renvoie false. Que doit faire le code ensuite ?
Récapitulatif : StampedLock
Points essentiels :
- Trois modes : lecture optimiste (sans verrou), verrou de lecture et verrou d’écriture
- tryOptimisticRead() + validate() — tentative de lecture sans coût
- En cas d’échec de la validation → repliez-vous sur readLock()
- NOT réentrant — risque d’interblocage si le même fil d’exécution acquiert de nouveau le verrou
- Aucune prise en charge des variables Condition — utilisez ReentrantReadWriteLock lorsque nécessaire
Questions Fréquemment Posées
La leçon « StampedLock et lectures optimistes » est-elle gratuite ?
Oui — le texte complet de « StampedLock et lectures optimistes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « StampedLock et lectures optimistes » ?
Appliquez le mode de lecture optimiste de StampedLock aux charges de travail à haut débit dominées par les lectures. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « StampedLock et lectures optimistes » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- ReentrantLock et synchronized
- ReadWriteLock pour les scénarios lecteur-rédacteur
- Variables atomiques : mises à jour sans verrou
- StampedLock et lectures optimistes