2012-04-13 2 views
2

나는 다음과 같은 지역의 방법이 :이 방법은 클래스 (예) 내에서 대중 몇 가지 방법에 의해 호출정적 메서드 사이의 호출 - 스레드 안전성이 저하 될까요? 공공 정적 클래스에서

private static int GetMaxFromList(IEnumerable<int> list) 
    { 
     var result = 0; 

     foreach (var i in list) 
     { 
      if (i > result) result = i; 
     } 

     return result; 
    } 

:

public static bool IsIntegrityOfDataSetGood(DataSet dataSet, KeyValuePair<string, List<int>> tableAndColumnIndexes) 
    { 
     return IsIntegrityOfDataSetGood(dataSet, tableAndColumnIndexes.Key) && 
       dataSet.Tables[tableAndColumnIndexes.Key].Columns.Count > GetMaxFromList(tableAndColumnIndexes.Value); 
    } 

참고이 공용 방법은 그 또한 클래스 내의 다른 public 메서드를 호출합니다.

클래스 메서드는 매개 변수를 통해 데이터를 보낸 경우에만 작동하지만 정적 메서드 간 호출이 스레드 안전을 엉망으로 만들 것이라고 걱정됩니다. 나는 걱정할 권리가 있니?

이 코드는 .NET 2.0 프로젝트에 있습니다.

+0

정적 메서드가 스레드로부터 안전하지 않은 (정적 인) 개체/메서드에 액세스하는 경우에만 언급 한대로 메서드는 제공된 목록 만 사용합니다. 호출 중에 'list'가 제공되면 ('tableAndColumnIndexes.Value') 문제가 발생할 수 있습니다. –

+0

btw,'tableAndColumnIndexes.Value.Max()'참조 -'GetMaxFromList' 메쏘드가 필요 없음 –

+4

스레드 안전성은 * 전체 * 프로그램의 * global * 속성입니다. 개별 메소드를 살펴보고 각 메소드가 스레드 세이프인지 결정할 수없고 전체 프로그램이 스레드 세이프라고 결론 내릴 수 없습니다. 개별 벽돌을 볼 수없고 그 중 어느 것도 속이 빈 것을 발견 할 수 없으며 그 벽돌로 만든 집 또한 움푹 파이지 않을 것이라고 결론 내릴 수 있습니다. –

답변

4

아니요,이 메시지는 이 아니며은 스레드 안전을 보호합니다.

하지만 실제로 스레드로부터 안전한지 여부는 tableAndColumnIndexes의 출처와 다른 스레드가 액세스 할 수있는 위치에 따라 다릅니다. 즉, 호출 코드에 따라 다릅니다.

3

다른 스레드가 list 시퀀스를 변경하지 않는 한 절대적으로 좋습니다. 공유 상태에 액세스하지 않고 매개 변수 만 사용합니다. 다른 스레드 인 경우 시퀀스를 수정하면 InvalidOperationException이 표시됩니다.

스레드 안전성과 정적 방법에 대해 오해가 있을지 모르지만 그게 무엇인지 정확하게 말하기는 어렵습니다 ... Eric Lippert의 블로그 게시물 "What is this thing you call thread safe?"이 유용 할 수 있습니다.

+0

고마워, 그리고 나는 오해에 대해 동의한다고 생각한다. DefaultIfEmpty()에 대해서 프로젝트는 .NET 2.0에서 실행된다. – JustAnotherCoder

+0

@JustAnotherCoder : Ick - 알겠습니다. (그것은 아마도 미래의 질문에서 언급할만한 가치가있을 것입니다. btw ...이 경우에는 접선이었습니다.) 저는 제 대답에서 그 부분을 편집했습니다. –

+0

나는 동의하며 LINQ 팁은 모두 동일하게 평가되었습니다. – JustAnotherCoder

관련 문제