Récemment , j'appris l'existence StampedLock
?
https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/locks/StampedLock.html j'ai réalisé que il est amélioré ReentrantReadWriteLock avec quelques differernces:
- Est-ce pas rentrante
- Prise en charge de verrouillage optomistic
- Prise en charge mise à niveau de READLOCK à writeLock
Aussi je lis des exemples frpm javadoc mais je ne suis pas understant ce code:
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
// a read-only method
// upgrade from optimistic read to read lock
double distanceFromOrigin() {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.readLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
return Math.hypot(currentX, currentY);
}
} finally {
if (StampedLock.isReadLockStamp(stamp))
sl.unlockRead(stamp);
}
}
}
Qu'est-ce que cela signifie possibly racy reads
? [ANSWERRED EN COMMENTAIRES]
Est - ce un problème si un autre thread lit x
ou y
? [ANSWERRED EN COMMENTAIRES]
pourquoi nous exécutons tryOptimisticRead d'abord et READLOCK dans la boucle en cas de défaillance tryOptimisticRead? ce que la logique?
Pourquoi est - ce que nous avons if (StampedLock.isReadLockStamp(stamp))
bloc à l' intérieur enfin vbefore déverrouiller?
pourquoi nous exécutons tryOptimisticRead d'abord et READLOCK dans la boucle en cas de défaillance tryOptimisticRead? ce que la logique?
Un meilleur scénario est pour nous d'être en mesure de lire x
et y
sans avoir à acquérir un verrou. Cela ne signifie pas que nous n'établissons pas arrive-avant relation, cela signifie simplement que nous ne avons pas besoin d'invoquer une action de blocage possible.
tryOptimisticRead
nous renvoie une valeur de timbre. Cette volatile
lecture de l' état interne établit que rien écrit avant l'écriture volatile de cette valeur estampillée sera visible après une lecture ultérieure . Cela signifie que , si la valeur estampillée retournée dans tryOptimisticRead
ne change pas pendant que vous lisez x
et y
, puis une autre écriture ne se produit pas et nous avons le plus jusqu'à des valeurs de date. Si la valeur estampillée ne change, cependant, tous les paris sont ouverts et vous devez vous protéger expliqué ci - dessous.
Il est possible, et, en fonction de votre cas d'utilisation, probablement, que x
et y
changera à un moment donné tout au long de votre exécution de distanceFromOrigin
. Si x
et le y
changement, et peut - être changer souvent, vous allez vouloir pour réussir finalement.
La readLock
est la voie du programme de dire « Ok, je donne, Lisons juste une façon de blocage ». En théorie, vous pouvez écrire votre code à tryOptimisticRead
quelques reprises avant de finalement invoquer readLock
, mais vous allez vouloir vous donner un en cas x
et y
sont mises à jour en permanence.
Pourquoi est-ce que nous avons si (StampedLock.isReadLockStamp (timbre)) à l'intérieur enfin déverrouiller vbefore bloc?
Si readLock
est invoqué, vous devrez libérer avant de sortir pour que la suite writeLock
peut acquérir le verrou. Si vous réussissez à tryOptimisticRead
vous ne devez libérer un readLock
que vous jamais eu besoin d'acquérir en premier lieu.