最近、私は存在を知りましたか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コメント]
別のスレッドが読み取った場合、それは問題ですx
かy
?[ANSWERREDのINコメント]
なぜ我々はtryOptimisticReadに障害が発生した場合には、forループで最初とreadLock tryOptimisticReadを実行していますか?何ロジック?
なぜ我々はしているんif (StampedLock.isReadLockStamp(stamp))
内部の最終的vbeforeアンロックをブロック?
なぜ我々はtryOptimisticReadに障害が発生した場合には、forループで最初とreadLock tryOptimisticReadを実行していますか?何ロジック?
私たちが読むことができるようにするための最良のケースのシナリオがあるx
とy
ロックを取得する必要はありません。それは我々が起こる-前に関係を確立していないという意味ではありません、それだけで私たちは可能な遮断作用を起動する必要はないことを意味します。
tryOptimisticRead
私たちのスタンプ値を返します。このvolatile
内部状態の読み取りは、その確立し、その後のリード後に表示されます。この刻印値の揮発性書き込み前に書かれたものを。ことを意味し、中に返された刻印値があればtryOptimisticRead
、あなたが読んでいる間は変更されませんx
とy
、その後、別の書き込みが発生していないと我々は最もまでの日付の値を持ちます。刻印値が変更を行う場合は、しかし、すべてのベットはオフになっているとあなた自身が以下に説明する保護する必要があります。
それはそれ、おそらく、あなたのユースケースに応じて、可能だし、x
とy
のあなたの実行を通じて、いくつかの点で変更されますdistanceFromOrigin
。場合x
とy
変更し、多分あなたは最終的に成功したいとしている、頻繁に変更。
readLock
「OK、私はちょうど、ブロッキングの方法でそれを読んで聞かせて、あきらめる」というのプログラムの方法です。理論的には、あなたはあなたにコードを書くことができtryOptimisticRead
、数回前に最終的に呼び出すことreadLock
ができますが、自分自身のケースでアウトを与えたいとしているx
と、y
常に更新されています。
なぜ私たちがもし(StampedLock.isReadLockStamp(スタンプ))内のfinallyブロックのvbeforeアンロックを持っていますか?
場合readLock
に呼び出され、あなたはそれに続くように出て行く前にそれを解放する必要がありますwriteLock
ロックを取得することができます。あなたが成功した場合tryOptimisticRead
、あなた解放する必要はありませんreadLock
あなたが最初の場所でそれを取得するために必要なことはありませんよう。