私は複数のスレッドからアクセスするreadonly-dictionaryを探しています。 ConcurrentDictionaryはこのような機能を公開していますが、オーバーヘッドと奇妙なAPIを持つことは望ましくありません。なぜReadOnlyDictionaryはスレッドセーフではありませんか?
.Net 4.5このようなクラスを提供している間、静的呼び出しのみが安全であることをドキュメントに記述しています。
なぜですか?
私は複数のスレッドからアクセスするreadonly-dictionaryを探しています。 ConcurrentDictionaryはこのような機能を公開していますが、オーバーヘッドと奇妙なAPIを持つことは望ましくありません。なぜReadOnlyDictionaryはスレッドセーフではありませんか?
.Net 4.5このようなクラスを提供している間、静的呼び出しのみが安全であることをドキュメントに記述しています。
なぜですか?
ReadOnlyDictionary
は、他の辞書のまわりのラッパーです。そのため、基本的な辞書と同じようにスレッドセーフです。
特に、別のスレッドがラッパーから読み取っている間に基本となる辞書を変更しているスレッドがある場合、安全の保証はありません。
あなたはすべて角度から効果的に不変であるReadOnlyDictionary
をしたい場合、あなたは、元の辞書のクローンを作成することを周りにReadOnlyDictionary
ラッパーを作成し、任意の場所にクローンへの参照を維持することはできません。 の読み取り操作だけでは、スレッドセーフでなければなりません。もちろん、キーまたは値の型が変更可能な場合、それは心配するために「スレッドセーフではない」第2度を開きます。
Microsoftのドキュメントからコピー: スレッドセーフティ ConcurrentDictionaryのpublicおよびprotectedメンバーはすべてスレッドセーフであり、複数のスレッドから同時に使用できます。 –
@KenCheung:あなたのコメントが関係する理由は明確ではありません。この質問は、OPがすでにConcurrentDictionary <,>を認識しているが、ReadOnlyDictionary <,>の安全性について質問していることを示しています。 –