1

次の 2 つの状況を考慮してください。

  1. 最初に一度データを入力し、その後多くの異なるスレッドからアクセスされるマップ。
  2. 多くの異なるスレッドからアクセスされるキャッシュとして使用するマップ。マップに保存される結果が欠落していない限り、その計算を避けたい場合は、get-computation-store ブロックが同期されます。(それ以外の場合、マップは使用されません)

これらのケースのいずれかでConcurrentHashMap、通常以上のスレッド セーフに関して何か追加の機能はありますHashMapか?

4

2 に答える 2

0

最初のケースでは、実際には問題にならないはずですが、通常のハッシュマップに書き込まれた変更が他のスレッドに表示されるという保証はありません。そのため、1 つのスレッドが最初にマップを作成して設定し、そのスレッドが他のスレッドと同期していない場合、それらのスレッドはマップに設定された初期値を認識しない可能性があります。

上記の状況は実際にはありそうになく、単一の同期イベントのみを取るか、スレッド間の保証の前に発生します (たとえば、揮発性変数への読み取り/書き込み) 理論的な正確ささえ保証します。

2 番目のケースでは、構造的に変更する (値を追加する) HashMap へのアクセスには同期が必要になるため、懸念があります。さらに、先行発生関係/他のスレッドとの共有可視性を確立するために何らかのタイプの同期が必要です。または、他のスレッドが入力した新しい値を参照するという保証はありません。 ConcurrentHashMap はこれらの保証を提供し、スレッドはそれを構造的に変更します。

于 2011-12-21T23:05:41.957 に答える
0

スレッドセーフに違いはありません。シナリオ 2 では、パフォーマンスに違いがあり、タイミング保証にわずかな違いがあります。

シナリオ 2 では同期が行われないため、キャッシュを使用するスレッドは、キューに入れ、他のスレッドが終了するのを待つ必要がありません。ただし、その利点を得るために、同期の境界でハードな発生前の関係を持たないため、2 つのスレッドが同じキャッシュ値を多かれ少なかれ同時に計算する可能性があります。これは、計算が反復可能である限り、通常は無害です。

(ConcurrentHashMap がキーとして使用できないというわずかな違いもありnullます。)

于 2011-12-21T23:05:51.087 に答える