不変のスカラコレクション(immutable.HashMapなど)がスレッドセーフであるかどうかを知りたいと思います。内容は明らかに変わることはありませんが、最適化のための内部状態の変更可能な状態は私にとって不明です。スカラ不変なコレクションはスレッドセーフですか?
キーと値は、彼らがあなたの助けを
おかげ
不変のスカラコレクション(immutable.HashMapなど)がスレッドセーフであるかどうかを知りたいと思います。内容は明らかに変わることはありませんが、最適化のための内部状態の変更可能な状態は私にとって不明です。スカラ不変なコレクションはスレッドセーフですか?
キーと値は、彼らがあなたの助けを
おかげ
いいえ、そうではありません。
コレクションが不変であっても、内部的に変更可能な状態がある可能性があります。例えばベクトルとListのドキュメントは、明示的にそれを
注意を述べている:不変なコレクションであるにもかかわらず、実装は、建設中に内部的に変更可能な状態を使用しています。これらの状態の変更は、シングルスレッドコードでは表示されませんが、マルチスレッドシナリオでは競合状態につながる可能性があります。新しいコレクションインスタンスの状態は、(Java Memory Model仕様の意味で)「公開」されていない可能性があります。そのため、別のスレッドからの非同期不揮発性読み取りでオブジェクトが無効な状態である可能性があります(詳細はSI-7838を参照)。 )。このような読み込みは、書かれたオブジェクトをまったく見ることが保証されていないため、この問題にかかわらず、使用しないでください。最も簡単な回避策は、スレッド間で値を揮発性の変数に交換することです。
「内部状態の可変状態」とは何ですか? – ipoteka
不変のコレクションによって保持されているオブジェクトを操作しようとしている場合は、スレッドセーフではないことは明らかです。これらのオブジェクトは不変でなければなりません。 – Atais
キーと値が不変であると仮定した場合 – ogen