2017-10-30 15 views
2

이 질문은 주로 학술적 질문입니다. IDictionary 및 ConcurrentDictionary의 스레드 안전 고려 사항

는 스레드 안전 문제가되는 코드를 살펴 보자 :

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

... 

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

내 전반적인 질문 : 어떻게이보기의 동시성 지점에서 처리?

스레드 안전하다고 간주 될 수 있습니까? 그렇다면 이유는 무엇입니까? (알려진) thread-safe 메서드가 과 함께 액세스 할 수없는 AddOrUpdate이기 때문에 묻습니다. CLR은 여기서 무슨 일이 일어나고 있는지 충분히 "똑똑"합니까? 여기에 누락 된 상속 재산이 있습니까? .Add 전화가 .AddOrUpdate "후드"로 변경 될 수 있습니까?

답변

1

여기에는 CLR이 관련되지 않습니다. ConcurrentDictionary 암시 적 인터페이스 IDictionary<TKey, TValue>를 구현하고, 당신은 IDictionary.Addhere을 위해 무엇을 볼 수 있습니다 그래서 TryAdd (ConcurrentDictionary의 "안전"방법을)를 호출하고 키 추가 할 수 없습니다 경우

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

- 예외에게 같은 키를 사용하여 해당 항목을 던졌습니다 이미 존재 함.

일반 사전을 사용하고 여러 스레드에서 항목을 추가하는 불쾌한 부작용이 없으므로 여전히 "스레드 안전"입니다. 이러한 예외를 대비한다면 - Add으로 항목을 여러 스레드의 사전에 안전하게 추가 할 수 있습니다.