2010-11-26 1 views
23

나는 정적 읽기 전용 사전이 있습니다. 아니요이 사전에 대한 수정이 이루어집니다.읽기 전용 사전 - 여러 스레드 호출 .ContainsKey 메서드

.ContainsKey (Key)를 사용하여이 사전에서 읽는 스레드가 여러 개 있습니다. 예 :

class MyData 
{ 
    private static private IDictionary<int, string> _dictionary = new Dictionary<int, string>(); 

    MyData() 
    { 
     // Load Dictionary here 
    } 

    public string GetValue(int key) 
    { 
     if (_dictionary.ContainsKey(key)) 
     { 
      return _dictionary[key]; 
     } 
    } 
} 

이렇게하는 데 문제가 있습니까?

답변

19

아무도 돌연변이를 일으키지 않는다면 : 괜찮습니다. 가끔 개의 수정 사항이있는 경우 ReaderWriterLockSlim을 보거나 (나의 환경 설정) 스냅 샷/사본을 편집하고 참조를 교체하십시오.

+0

를 사용할 수 있습니다하지만 당신은 여전히 ​​필요 당신은 같은 시간에 데이터를 기록 할 수 있었다 (그리고 당신은 .NET 4.0을 사용했다) 경우 참조를 바꾸는 동안 ReaderWriterLockSlim을 사용 하시겠습니까? –

+1

@Mark : 참조를 작성하는 것은 원자 적으로 이루어 지지만 다른 스레드가 변경 사항을 볼 수 있도록 '휘발성'필드를 표시하고 싶을 것입니다. – LukeH

+0

ContainsKey 메서드를 실행하는 도중에 참조를 바꾼다면 문제가 발생할 수 있다고 생각하고 있었나요? –

3

읽기만하면 안전합니다.

1

여러 스레드에서 읽기 전에 '추가'가 모두 완료되면 문제가 없습니다. 그 읽기 전용이 스레드 안전을 의미하지 않기 때문에 - 그것은 그렇지 않습니다.

은 아마 당신은 사용자 ReaderWriterLock 액세스 동기화해야