0

私が持っているとしましょう:

MyCollection = new ConcurrentDictionary<string, int>();

にアイテムを安全に追加および削除できるようになりMyCollectionました。しかし、アイテムの変更についてはどうですか。たとえば、次のことを行うのは安全ですか。

MyCollection["key"] = 1;   // thread 1

MyCollection["key"] = 2;   // thread 2

例 2:

MyCollection2 = new ConcurrentDictionary<string, List<int>>();

それは安全ですか?

MyCollection2["key"].Add(1);  // Thread1

MyCollection2["key"].Add(2);  // Thread2

ここで、Thread1 と Thread2 が同時に実行されています。アイテムを変更するときにロックを作成する必要がありますか?

4

2 に答える 2

2

最初は完全に安全です。ConcurrentDictionary はスレッドセーフであるため、異なるスレッドで同時に値を取得/設定しても問題は発生しません。

あなたの2番目は安全ではありません。ConcurrentDictionary に X 型のインスタンスへの参照が含まれているからといって、X 型がスレッド セーフになるわけではありません。特定のキーの値にアクセスしている間もブロックしません。

覚えて、

MyCollection2["key"].Add(1);

と同じです

var list = MyCollection2["key"];
list.Add(1);

この場合、すべてのスレッド セーフ コード (ConcurrentDictionary アクセス) は完了していますが、非スレッド セーフ コード (List<T>アクセス)は完了していないことは明らかです。

于 2013-11-25T19:43:02.897 に答える