9

私が理解していることから、Java 5以降の同時ハッシュマップは、イテレーターと更新にブロッキングアクセスを使用しないスレッドセーフハッシュマップを提供します(同時実行レベルが十分な場合)。

次の条件が与えられます。

  1. 挿入は 1 回だけ行われます (アプリケーションの初期化中)。
  2. 各スレッドは、挿入するキーのセットを取得します。これらのキーは、他のスレッドとは共有されていません。
  3. 更新は決して起こりません。
  4. 選択は、アプリケーションの初期化が終了した後にのみ行われます。

単純なハッシュマップを使用した方がよいでしょうか?

私の理解では、私の鍵が衝突しないので、私はおそらくより良い状態になるでしょう - 私は保証することができます. しかし、Java の実装が、たとえば同じバケットを 2 つの異なるキーに割り当てることによって、ハッシュ バケット内で物事を台無しにする可能性はありますか?

4

2 に答える 2

20

複数のスレッドを使用して挿入している場合は、キーが異なっていても、必ずConcurrentHashMap挿入を使用または同期する必要があります。プレーンは、同時書き込みに対してHashMap 安全ではありません。2 つのスレッドがそれぞれ同時に内部テーブルを展開する必要があるとします...それらが異なるキーを使用していても、それは根本的に問題のある状況です。

アプリケーションの存続期間の残りの部分でa を使用すると問題が発生するという確かな証拠がある場合 (実際にそうConcurrentHashMapであるとはとても思えません)、最初に並行ハッシュ マップを作成して、それをHashMap(またはGuavaからの不変のコレクションでさえ) 単一のスレッドで、「最終マップが公開された」と「スレッドが最終マップを読み取る」の間に事前発生バリアがあることを確認します。

于 2012-11-21T14:07:34.247 に答える
2

スレッド全体に独立したキーがある場合は、独立したマップを検討できます。これがオプションの場合、各スレッドは独自のHashMapを持つことができますが、1つのスレッドでのみ使用される場合は、スレッドセーフである必要はありません。

于 2012-11-21T14:24:43.357 に答える