2017-01-30 15 views
1

不変のスカラコレクション(immutable.HashMapなど)がスレッドセーフであるかどうかを知りたいと思います。内容は明らかに変わることはありませんが、最適化のための内部状態の変更可能な状態は私にとって不明です。スカラ不変なコレクションはスレッドセーフですか?

キーと値は、彼らがあなたの助けを

おかげ

+1

「内部状態の可変状態」とは何ですか? – ipoteka

+0

不変のコレクションによって保持されているオブジェクトを操作しようとしている場合は、スレッドセーフではないことは明らかです。これらのオブジェクトは不変でなければなりません。 – Atais

+0

キーと値が不変であると仮定した場合 – ogen

答えて

2

不変であると想定されています。

更新ごとに新しいコレクションが作成されます。不要なコピーを避けるために、構造的な共有が使用されるため、常にコレクションのいくつかのバージョンを参照することができ、その特定のバージョンはスレッドセーフです。

+0

ご協力ありがとうございます。これに関する公式の文書はありますか? Java HashMapのdocは、getがコレクションに対して更新されない限りスレッドセーフであることを明示的に示しています。 – ogen

+2

@ogen不変のコレクションを更新することはできません。不変性は自動的にスレッドの安全性をもたらします。 – puhlen

2

いいえ、そうではありません。

コレクションが不変であっても、内部的に変更可能な状態がある可能性があります。例えばベクトルとListのドキュメントは、明示的にそれを

注意を述べている:不変なコレクションであるにもかかわらず、実装は、建設中に内部的に変更可能な状態を使用しています。これらの状態の変更は、シングルスレッドコードでは表示されませんが、マルチスレッドシナリオでは競合状態につながる可能性があります。新しいコレクションインスタンスの状態は、(Java Memory Model仕様の意味で)「公開」されていない可能性があります。そのため、別のスレッドからの非同期不揮発性読み取りでオブジェクトが無効な状態である可能性があります(詳細はSI-7838を参照)。 )。このような読み込みは、書かれたオブジェクトをまったく見ることが保証されていないため、この問題にかかわらず、使用しないでください。最も簡単な回避策は、スレッド間で値を揮発性の変数に交換することです。

関連する問題