0

最近、調査ConcurrentSkipListMap中にその実装を調べたところ、その put メソッドがスレッドセーフではないことがわかりました。doPut実際にアイテムを追加する内部呼び出し。しかし、この方法ではConcurrentHashMap.

addしたがって、スレッドセーフかどうかを知りたいです。メソッドを見ると、スレッドセーフではないようです。つまり、このメソッドが 2 つのスレッドによって同時に実行されると、問題が発生する可能性があります。

ConcurrentSkipListMap内部でskiplistデータ構造を使用していることは知っていますが、addメソッドがスレッドセーフであることを期待していました。私は何か間違ったことを理解していますか? 本当にConcurrentSkipListMapスレッドセーフではありませんか?

4

3 に答える 3

2

実装のコメントには次のように書かれています。

ツリーのようなインデックス ノードを使用することを考えると、代わりに何らかの種類の検索ツリーを使用しない理由を疑問に思うかもしれません。その理由は、検索ツリーの効率的なロックフリー挿入および削除アルゴリズムが知られていないためです。インデックス ノードの「ダウン」リンクの不変性 (トゥルー ツリーの変更可能な「レフト」フィールドとは対照的に) は、CAS 操作のみを使用してこれを扱いやすくします。

そのため、比較とスワップ操作を備えた低レベルのプログラミング機能を使用して、マップをアトミックに変更します。これにより、アクセスを同期する必要なく、スレッドの安全性が確保されます。

ソースコードで詳しく読むことができます。

于 2015-03-06T12:20:03.590 に答える
2

a を使用しないからといっLockて、スレッドが安全でないわけではありません。スキップ リスト構造は、ロック フリーで実装できます。

APIを注意深く読む必要があります。

...挿入、削除、更新、およびアクセス操作は、複数のスレッドによって同時に安全に実行されます。イテレータは一貫性が弱く、イテレータの作成時または作成後のマップの状態を反映する要素を返します。これらは ConcurrentModificationException をスローせず、他の操作と同時に処理を進めることができます。...

于 2015-03-06T12:02:48.917 に答える