78

Book Java Concurrency in Practiceを読んでいます。第 15 章では、ノンブロッキング アルゴリズムとコンペア アンド スワップ(CAS) メソッドについて説明しています。

CAS はロック方式よりもはるかに優れたパフォーマンスを発揮すると書かれています。すでにこれらの両方の概念を使用している人々に聞きたいのですが、これらの概念のどちらを好むかを知りたいですか? 本当にそんなに速いのですか?

私にとって、ロックの使用法ははるかに明確で理解しやすく、おそらく維持するのも優れています(間違っている場合は修正してください)。パフォーマンスを向上させるために、ロックよりも CAS に関連する並行コードの作成に本当に集中すべきでしょうか、それとも持続可能性の方が重要なのでしょうか?

いつ何を使用するかという厳密な規則はないかもしれません。しかし、CAS の新しい概念に関する意見や経験を聞きたいと思います。

4

5 に答える 5

51

一般に、CAS はロックよりもはるかに高速ですが、競合の程度によって異なります。値が読み取りと比較の間で変化した場合、CAS は再試行を強制する可能性があるため、問題の変数が他の多くのスレッドによって激しくヒットされている場合 (または新しい値を計算するのにコストがかかる場合)、スレッドは理論的にはビジー待機でスタックする可能性があります。古い値から (または両方))。

CAS の主な問題は、ロックよりも正しくプログラムするのがはるかに難しいことです。ロックは、メッセージパッシングやSTMよりも正しく使用するのがはるかに難しいため、これをロックの使用を強く推奨するものと見なさないでください。

于 2010-04-18T22:22:21.410 に答える
29

操作の相対速度は、ほとんど問題になりません。関連するのは、ロックベースのアルゴリズムとノンブロッキング アルゴリズムのスケーラビリティの違いです。また、1 コアまたは 2 コアのシステムで実行している場合は、そのようなことを考えるのをやめてください。

ノンブロッキング アルゴリズムは、ロックベースのアルゴリズムよりも「クリティカル セクション」が短いため、一般的にスケーラビリティに優れています。

于 2010-04-29T00:01:51.590 に答える
24

ConcurrentLinkedQueueaと a の間の数字を見ることができますBlockingQueue。中程度の (実際のアプリケーションではより現実的な) スレッド競合下では、 CASが著しく高速であることがわかります。

ノンブロッキングアルゴリズムの最も魅力的な特性は、1 つのスレッドが失敗した場合 (キャッシュ ミス、またはさらに悪いことに、セグ フォールト)、他のスレッドがこの失敗に気付かず、先に進むことができるという事実です。ただし、ロックを取得するときに、ロックを保持しているスレッドに何らかの OS 障害があると、ロックが解放されるのを待っている他のすべてのスレッドにも障害が発生します。

あなたの質問に答えるために、はい、ノンブロッキング スレッド セーフ アルゴリズムまたはコレクション ( ConcurrentLinkedQueueConcurrentSkipListMap/Set) は、ブロッキング対応のものよりも大幅に高速になる可能性があります。ただし、Marcelo が指摘したように、ノンブロッキング アルゴリズムを正しくすることは非常に難しく、多くの考慮が必要です。

Michael と Scottの Queue について読む必要があります。これは のキューの実装であり、単一のCASConcurrentLinkedQueueで双方向のスレッドセーフなアトミック関数を処理する方法を説明しています。

于 2010-04-18T23:00:49.620 に答える
14

ロックフリーの並行性のトピックに強く関連する優れた本があります: Maurice Herlihy による「The Art of multi-processor programming」です。

于 2010-04-22T10:15:38.140 に答える