2012-12-03 16 views
7

私は複数のスレッドからアクセスするreadonly-dictionaryを探しています。 ConcurrentDictionaryはこのような機能を公開していますが、オーバーヘッドと奇妙なAPIを持つことは望ましくありません。なぜReadOnlyDictionaryはスレッドセーフではありませんか?

.Net 4.5このようなクラスを提供している間、静的呼び出しのみが安全であることをドキュメントに記述しています。

なぜですか?

+0

Microsoftのドキュメントからコピー: スレッドセーフティ ConcurrentDictionary のpublicおよびprotectedメンバーはすべてスレッドセーフであり、複数のスレッドから同時に使用できます。 –

+3

@KenCheung:あなたのコメントが関係する理由は明確ではありません。この質問は、OPがすでにConcurrentDictionary <,>を認識しているが、ReadOnlyDictionary <,>の安全性について質問していることを示しています。 –

答えて

8

ReadOnlyDictionaryは、他の辞書のまわりのラッパーです。そのため、基本的な辞書と同じようにスレッドセーフです。

特に、別のスレッドがラッパーから読み取っている間に基本となる辞書を変更しているスレッドがある場合、安全の保証はありません。

あなたはすべて角度から効果的に不変であるReadOnlyDictionaryをしたい場合、あなたは、元の辞書のクローンを作成することを周りにReadOnlyDictionaryラッパーを作成し、任意の場所にクローンへの参照を維持することはできません。 の読み取り操作だけでは、スレッドセーフでなければなりません。もちろん、キーまたは値の型が変更可能な場合、それは心配するために「スレッドセーフではない」第2度を開きます。

+0

私もそう思った。ありがとう。 – Mouk

+3

ちょうど明確化。読み取り専用はスレッドセーフではありません。辞書が読み上げた使用法に基づいて項目を並べ替えるとどうなりますか? BCLディクショナリはそれを実行しませんが(AFAIK)、私はScripting.Dictionaryが最後に読み込んだ項目をバケットの最初の位置に移動する場所を読んでいます。 – adrianm

+1

@adrianm:はい、そうです。しかし、決して変更されなかった 'System.Collections.Generic.Dictionary'をラップすることができ、*は*大丈夫でしょう。 –