StampedLock楽観的ロックを使用するにはどうやって?(私はJavaのドキュメントからのサンプルコードを理解することはできません)

gstackoverflow:

最近、私は存在を知りましたかStampedLock

https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/locks/StampedLock.html私はそれはいくつかのdiffererncesとReentrantReadWriteLockを向上していることに気づきました。

  • リエントラントではありません
  • optomisticロックをサポートしています
  • 支持体はreadLockからの書き込みロックにアップグレード

また、私は例のFRPMのJavadocを読んで、私は、コードことはないunderstant行います。

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);
    }
  }
}

それが何を意味するのでしょうかpossibly racy reads[ANSWERREDのINコメント]

別のスレッドが読み取った場合、それは問題ですxy[ANSWERREDのINコメント]

なぜ我々はtryOptimisticReadに障害が発生した場合には、forループで最初とreadLock tryOptimisticReadを実行していますか?何ロジック?

なぜ我々はしているんif (StampedLock.isReadLockStamp(stamp))内部の最終的vbeforeアンロックをブロック?

ジョンのVint:

なぜ我々はtryOptimisticReadに障害が発生した場合には、forループで最初とreadLock tryOptimisticReadを実行していますか?何ロジック?

私たちが読むことができるようにするための最良のケースのシナリオがあるxyロックを取得する必要はありません。それは我々が起こる-前に関係を確立していないという意味ではありません、それだけで私たちは可能な遮断作用を起動する必要はないことを意味します。

tryOptimisticRead私たちのスタンプ値を返します。このvolatile内部状態の読み取りは、その確立し、その後のリード後に表示されます。この刻印値の揮発性書き込み前に書かれたものをことを意味し、中に返された刻印値があればtryOptimisticRead、あなたが読んでいる間は変更されませんxy、その後、別の書き込みが発生していないと我々は最もまでの日付の値を持ちます。刻印値が変更を行う場合は、しかし、すべてのベットはオフになっているとあなた自身が以下に説明する保護する必要があります。

それはそれ、おそらく、あなたのユースケースに応じて、可能だし、xyのあなたの実行を通じて、いくつかの点で変更されますdistanceFromOrigin場合xy変更し、多分あなたは最終的に成功したいとしている、頻繁に変更。

readLock「OK、私はちょうど、ブロッキングの方法でそれを読んで聞かせて、あきらめる」というのプログラムの方法です。理論的には、あなたはあなたにコードを書くことができtryOptimisticRead、数回前に最終的に呼び出すことreadLockができますが、自分自身のケースでアウトを与えたいとしているxと、y常に更新されています。

なぜ私たちがもし(StampedLock.isReadLockStamp(スタンプ))内のfinallyブロックのvbeforeアンロックを持っていますか?

場合readLockに呼び出され、あなたはそれに続くように出て行く前にそれを解放する必要がありますwriteLockロックを取得することができます。あなたが成功した場合tryOptimisticRead、あなた解放する必要はありませんreadLockあなたが最初の場所でそれを取得するために必要なことはありませんよう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=183601&siteId=1