どのようにHashMap.computeIfAbsentは、マルチスレッドの使用で失敗するのでしょうか?

ジョン・ドウ:

java.util.HashMapをのドキュメントには明記:「複数のスレッドが同時にハッシュマップにアクセスし、マップ構造的にスレッドの修正の少なくとも一方が、それは外部で同期をとる必要があります。」

しかし、あなたはcomputeIfAbsentは、HashMapの(なし除去/立ち退き)で呼び出されるだけ不変オブジェクトの作成を、減らすためにキャッシュとしてマップを使用してユースケースを考えます。そして、あなたが気に唯一のものはcomputeIfAbsentが有効なオブジェクトを返すことです。computeIfAbsentは時折、余分なオブジェクトを生成したり、既存のエントリを上書きするかどうかは気にしないでください。

起こり得る最悪の事態は何ですか?私のカジュアルなテストでは否定的な影響はありません。(私は、のConcurrentHashMapを使用したいが、それはこのユースケースでは比較的遅いです。)

GhostCat敬礼モニカC.:

ここでの問題は:すべての場合、そのスレッドの安全性は以下のようになり、実装の詳細。1つのJVMバージョンのために働くために起こるが、java.util.HashMapを他のいくつかのバージョンでは若干異なる、または「オフ」である可能性があります。

別の引用答えを

ことでは、最も一般的に使用されるマップの実装、特にHashMapのは、スレッドセーフではありません、と述べました。異なるスレッドからの要素を追加すると、挿入されている例の要素は、それらそのいる本サイズ()を示しても取得できない一貫性のない状態でのマップを残すことができます。

言い換えれば、あなたは今日の問題を持っていない場合でも、ちょうど別のJavaバージョンへの切り替えは、理論的に失敗するデザインを開くことができます。

覚えておいてください:あなたが持っている唯一の保証はMapインタフェースです。あなたは、使用しているコンテナを取得しますいくつかの内部構造を有し更新複数のスレッドによってを。それが発生した場合にはない矛盾原因そしてそれは純粋である偶然の一致

マルチスレッドの設定になり、「ちょうど仕事」を読んで、HashMapのに書き込む場合は、なぜ最初の場所で必要とさConcurrentHashMapのでしょう?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=234017&siteId=1