2017-10-30 17 views
2

この質問は主に学術的なものです。これは必ずしも実用的なコードではないと私は理解しています。 IDictionaryとConcurrentDictionaryのスレッドセーフティに関する考慮

は、スレッドの安全性が懸念され、このコードを、考えてみましょう:

// In the constructor 
IDictionary<string, string> myDictionary = new ConcurrentDictionary<string, string>(); 

... 

// Elsewhere in the class 
myDictionary.Add("foo", "bar"); 

私の全体的な質問:どのようにこれはビューの同時実行性の観点から処理されますか?

これはスレッドセーフであると考えられますか?その場合、なぜですか?スレッドセーフな(既知の)スレッドセーフメソッドがAddOrUpdateなので、私は尋ねます - これにはIDictionaryでアクセスできません。ここで何が起こっているのかを知るにはCLRは「十分にスマート」ですか?私がここで紛失している遺産の特性はありますか?.Addコールは.AddOrUpdateと呼ばれていますか?

答えて

1

ここではCLRは関係ありません。 ConcurrentDictionaryは、暗黙的インタフェースIDictionary<TKey, TValue>を実装し、あなたはそれがIDictionary.Addhereのために何を見ることができます:だからそれはTryAddConcurrentDictionaryの「安全な」メソッド)を呼び出して、キーを追加することができませんでした場合

void IDictionary<TKey, TValue>.Add(TKey key, TValue value) 
{ 
    if (!TryAdd(key, value)) 
    { 
      throw new ArgumentException(GetResource("ConcurrentDictionary_KeyAlreadyExisted")); 
    } 
} 

- 例外に、キーとそのエントリをスローしますもう存在している。

通常の辞書を使用して複数のスレッドから項目を追加するという厄介な副作用がないので、それはまだ「スレッドセーフ」です。このような例外の準備ができていれば、Addの項目を複数のスレッドから安全に追加することができます。

関連する問題