Comment utiliser StampedLock verrouillage optimiste? (Je ne comprends pas exemple de code de doc java)

gstackoverflow:

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 xou 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?

John Vint:

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 xet ysans 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.

tryOptimisticReadnous renvoie une valeur de timbre. Cette volatilelecture 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 tryOptimisticReadne change pas pendant que vous lisez xet 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 xet ychangera à un moment donné tout au long de votre exécution de distanceFromOrigin. Si xet le ychangement, et peut - être changer souvent, vous allez vouloir pour réussir finalement.

La readLockest la voie du programme de dire « Ok, je donne, Lisons juste une façon de blocage ». En théorie, vous pouvez écrire votre code à tryOptimisticReadquelques reprises avant de finalement invoquer readLock, mais vous allez vouloir vous donner un en cas xet ysont mises à jour en permanence.

Pourquoi est-ce que nous avons si (StampedLock.isReadLockStamp (timbre)) à l'intérieur enfin déverrouiller vbefore bloc?

Si readLockest invoqué, vous devrez libérer avant de sortir pour que la suite writeLockpeut acquérir le verrou. Si vous réussissez à tryOptimisticReadvous ne devez libérer un readLockque vous jamais eu besoin d'acquérir en premier lieu.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=183602&siteId=1
conseillé
Classement