내 응용 프로그램에는 동시에 여러 스레드에서 호출되는 정적 메서드가 있습니다. 데이터가 뒤섞 일 위험이 있습니까?
첫 번째 시도에서 메서드는 정적이 아니었고 클래스의 여러 인스턴스를 만들고있었습니다. 그 경우 내 데이터가 어떻게 든 뒤섞여있었습니다. 때때로 발생하기 때문에 이것이 어떻게 발생하는지 잘 모르겠습니다. 아직 디버깅 중입니다. 그러나 이제 방법은 지금까지 아무런 문제가 없습니다. 어쩌면 행운 일 수도 있습니다. 나는 확실히 모른다.
답변
메서드 내부에서 선언 된 변수 ( ” 캡처 된 “변수 제외)는 격리되어 있으므로 고유 한 문제가 발생하지 않습니다. 그러나 정적 메서드가 공유 상태에 액세스하면 모든 베팅이 해제됩니다.
공유 상태의 예는 다음과 같습니다.
- 정적 필드
- 공통 캐시에서 액세스 한 개체 (직렬화되지 않음)
- 입력 매개 변수 (및 해당 객체의 상태)를 통해 얻은 데이터 (여러 스레드가 동일한 객체에 닿을 수있는 경우)
상태를 공유 한 경우 다음 중 하나를 수행해야합니다.
- 이 (더 나은 공유 할 수 있습니다 일단 상태를 돌연변이하지 않도록주의 : 상태를 나타내며, 지역 변수로 상태의 스냅 샷을 사용 불변의 객체 – 즉 오히려 기준보다
whatever.SomeData
반복을 읽고whatever.SomeData
한 번 지역 변수로, 다음 변수를 사용하십시오-이것은 불변 상태에만 도움이됩니다!) - 데이터에 대한 액세스 동기화 (모든 스레드는 동기화해야 함)-상호 배타적이거나 (더 세분화 된) 리더 / 라이터
답변
네, 그냥 행운입니다. 😉
메서드가 정적인지 여부는 중요하지 않으며 데이터가 정적인지 여부는 중요합니다.
각 스레드에 자체 데이터 집합이있는 클래스의 개별 인스턴스가있는 경우 데이터가 뒤섞 일 위험이 없습니다. 데이터가 정적 인 경우 데이터 세트가 하나만 있고 모든 스레드가 동일한 데이터를 공유하므로 혼합하지 않을 방법이 없습니다.
별도의 인스턴스에있는 데이터가 여전히 엇갈리는 경우 데이터가 실제로 분리되지 않았기 때문일 가능성이 높습니다.
답변
정적 메서드는 여러 스레드에 적합해야합니다.
반면에 정적 데이터는 다른 스레드에서 동일한 데이터에 액세스하려는 시도를 제어하여 한 번에 하나의 스레드 만 데이터를 읽거나 쓰도록 제어해야하기 때문에 문제를 일으킬 수 있습니다.
답변
MSDN 항상 말한다 :
이 형식의 모든 공용 정적 (Visual Basic에서 공유) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드 안전이 보장되지 않습니다.
편집 : 여기에있는 사람들이 항상 그런 것은 아니며 이것이 적용되지 않는 사용자 생성 클래스가 아니라 BCL에서 이러한 방식으로 설계된 클래스에 분명히 적용됩니다.