2017-05-01 22 views
3

このcomparison of StampedLock and other locksは、競合が発生すると最も速いことを示しています(StampedLock)。しかし、これや他のさまざまな記事は、それがなぜより速いのかを列挙していません。他のタイプのロックと同じCASセマンティクスを使用しているようですか?競合が起きるにつれ、なぜそれが最速であるのか誰にも説明できますか?
たとえば、このコードでは、writeLockは他のwriteLocksだけでなく、readLocksもブロックします。私はこの時点でoptimisticReadLocksなどには関心がありません。ちょうどプレーンwriteLock ..利点は何ですか、どのようにReentrantLockより速いです(プラスリエントラントもありません)。なぜJava StampedLockがReentrantReadWriteLockよりも速いのですか

​​

答えて

1

明確にするために、StampedLockは、競合が発生すると読み込みがはるかに高速です。作家は少し早いですが、読むほど速くはありません。理由を説明します。

ほとんどの場合、読み取り - 書き込みロックでは、書き込みはかなり少なくなります。ただし、これにもかかわらず、ReentrantReadWriteLockreadLock()を取得するたびに、リーダー数を増やす必要があります。これにより、このロックを使用するすべてのコアで強制的にキャッシュ無効化が行われます。

重大な競合が発生すると、読み取り時に大幅な速度低下が発生する可能性があります。読み込みは速くなければなりません。readLock()変数を更新する必要はありません。直感的です。

代わりに、スタンプを持っているとか、バージョンと言うとどうすればいいですか? 1回の読取り反復で1回だけ更新されるもの。これは1つのスレッドだけスタンプ値を更新した場合、競合の下で、ロックで読みたいと思ったときに、すべての読みのスレッドがキャッシュヒットを実行されます(のは、書き込み後にしましょう)され、私たちのために何

。これにより、キャッシュの無効化が禁止され、RRWLよりも適切な方法でロックが実行されます。

tryOptimisticRead

  1. スタンプが変更された値を読むスタンプを取得(CASのような)を使用するときStampedLockを使用するためのパターンはロックフリーアルゴリズムに似ていますか?
    • はい、もう一度お試しいただくか、ブロッキングが
    • はありません、我々は良いです読み出す、のがに移りましょう。だから、
+0

ねえジョンさえStampedLockが...これを参照してくださいreadLockにいくつかの書き込みを使用しているように見える>> U.compareAndSwapLong(これ、STATE、S、次回= S + RUNIT) –

+0

ジョン、おそらく唯一の偉大な最適化は、readLockとWRITELOCKは、ミルの実行表示される手順1で上記の方法で使用されtryOptimisticRead ...、2、3です。右@ApurvaSinghだ –

+0

、 'tryOptimisticRead'はここに非常に便利であることです。 –

関連する問題