2010-06-14 3 views
75

내 응용 프로그램에서 나는 동시에 여러 스레드에서 호출되는 정적 메서드가 있습니다. 데이터가 섞일 위험이 있습니까?C# : 정적 메서드가 여러 스레드에서 호출되면 어떻게됩니까?

첫 번째 시도에서 메서드가 정적이 아니었고 클래스의 여러 인스턴스를 만들고있었습니다. 이 경우 내 데이터가 어딘지 혼란스러워졌습니다. 가끔씩 만 발생하기 때문에 이런 일이 발생하는지 잘 모르겠습니다. 아직 디버깅 중입니다. 하지만 지금은 아무런 문제가 없습니다. 어쩌면 운이 좋을 수도 있습니다. 나는 확실히 모른다.

답변

74

변수 내에서 선언 된 변수 (""변수를 캡처 한 예외가 있음)는 분리되어 있으므로 고유 한 문제가 발생하지 않습니다. 그러나 정적 메서드가 공유 상태에 액세스하면 모든 베팅이 해제됩니다. 공유 상태

로서는 것이다 :

  • 정적 필드 (해당 오브젝트와 상태) 공통
  • 데이터가 입력 파라미터를 통해 수득 하였다 (비 직렬화) 캐시로부터 액세스
  • 개체 ,은, 당신이 상태를 공유 한 경우 여러 스레드가 동일한 개체 (들)

에 맞춰져 있는지 가능하면 당신이 중 하나를 수행해야합니다

이 공유 할 수 있습니다 일단 0
  • 돌봐이 상태를 돌연변이하지 (더 나은 : 상태를 나타내며, 지역 변수로 상태의 스냅 샷을 불변의 객체를 사용하여 - 즉보다는 반복 whatever.SomeData를 참조하면 whatever.SomeData읽기 일단을 로컬 변수에 넣은 다음 변수 만 사용하십시오 -이 변수는 불변 상태에만 도움이됩니다!)
  • 데이터에 대한 액세스를 동기화합니다 (모든 스레드는 동기화해야합니다) - 상호 배타적 인 (보다 세분화 된) 리더/라이터
+1

http://msdn.microsoft.com/library/c5kehkcz(VS) .80) .aspx –

+1

@Diego - 저 또는 @Holli를위한 그 주석입니까? –

+0

Holli에게 회신에 실질적인 정보를 추가하십시오. –

9

정적 메서드는 여러 스레드에 적합해야합니다.

다른 한편 정적 데이터는 한 번에 하나의 스레드 만 데이터를 읽거나 쓰도록 다른 스레드에서 동일한 데이터에 액세스하려는 시도가 제어되어야하기 때문에 문제를 일으킬 수 있습니다.

+0

여기의 키워드는 동기화입니다 :-) –

+0

동시에 읽을 수 있지만 읽기와 쓰기가 동시에 발생하면 예기치 않은 동작이 발생합니다 – Freestyle076

4

MSDN 항상 말한다 :

이 형식의 모든 공용 static (Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버가 스레드로부터 안전하다는 보장은 없습니다.

편집 : 여기 사람이 말하는 으로, 항상 그런 것은 아니며, 명확하지이 적용되지 않는 사용자가 만든 클래스의 BCL에서이 방법을 설계 클래스에 적용됩니다.

16

예, 단지 운 좋았습니다. ;)

메서드가 정적인지 여부는 중요하지 않습니다. 중요한 것은 데이터가 정적인지 아닌지입니다.각 스레드는 데이터의 그것의 자신의 세트와 클래스의 그것의 자신의 별도의 인스턴스가있는 경우

는, 데이터의 위험이 혼합되고 있지있다. 데이터가 정적 인 경우 데이터 세트가 하나 뿐이며 모든 스레드가 동일한 데이터를 공유하므로 혼합하지 않는 방법은 없습니다. 개별 인스턴스에서 데이터가 여전히 혼합됩니다

는, 데이터가 실제로 분리되지 않기 때문에 가장 가능성이 높습니다.

관련 문제