문제

독서 MSDN 문서 사전의 경우 : "이 유형의 공개 정적 (시각적 기본 공유)은 스레드 안전합니다. 모든 인스턴스 멤버는 스레드 안전을 보장하지 않습니다."

이는 이와 같은 사전을 의미합니다.


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

아래 코드와 같은 일을 불필요합니까?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
도움이 되었습니까?

해결책

클래스 자체의 정적 방법을 언급하고 있습니다. 이 명령문은 실제로 대부분의 클래스에 추가 된 상용구 문서입니다. 사전 <> 클래스는 실제로 정적 메소드를 노출시키지 않습니다.

잠금 키워드 또는 readerwriterlock을 사용하여 사전 클래스에 대한 액세스를 직접화해야합니다. 스레딩은 매우 복잡한 주제이며 잠금 키워드가 항상 적절한 것은 아닙니다. Joe Duffy의 훌륭한 책이 있습니다. "Windows의 동시 프로그래밍"이것은 공유 응용 프로그램 자원을 보호하는 데 큰 깊이가 있습니다.

다른 팁

당신은 잘못 해석하고 있습니다 "공공 정적 회원 이 유형의 ""공개 정적 인스턴스 이 유형의 ".

이는 ADD 메소드 (인스턴스 메소드)를 호출하는 경우 자신의 잠금 또는 직렬화 시맨틱을 사용하여 사전에 독점적으로 액세스 할 수 있도록하는 것이 좋습니다. 두 스레드가 사전 상태를 동시에 수정하는 경우 나쁜 일이 발생할 수 있으며, 이것이 일어나지 않도록하는 것은 귀하의 책임입니다. Dictionary의 ADD 메소드 내에는이 잠금을 수행 할 것이 없습니다.

그러나 사전에서 정적 메소드를 호출한다면 (유용한 방법이 없음) 잠금 없이는 괜찮을 것입니다.

이것은 BCL의 모든 .NET 유형에 대한 일반적인 규칙입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top