2009-10-09 7 views
3

이론적 인 질문. 아래의 정적 메소드를 호출하는 aspx 웹 페이지에 100 개의 개별 요청이있는 경우.정적 메서드 및 IIS/asp.net의 호출 스택

public static GeocodeResult GeocodeQuery(string query) 
    { 
     int train, tube, dlr = 0; 

     // manipulate these ints 
     if (train) 
     { 
      // do something important 
     } 

    } 

모든 요청에 ​​별도의 호출 스택이 있습니까?

그렇다면 - 이 정적 메서드 호출이 이러한 개별 호출 스택에 푸시 되나요?

그렇다면 - 따라서 이러한 스레드는 안전합니까? 즉. 100 요청, 100 콜 프레임, 300 ints.

건배

답변

6

네, 각 요청에는 자체 호출 스택이 있습니다. 그리고 각 스택에는 query, train, tube, dir에 대한 자체 값이 포함될 것입니다. 로컬 변수와 메소드 매개 변수가 스택에 저장되기 때문입니다.

따라서 공유 상태에 액세스하지 않는 한이 메서드는 스레드로부터 안전합니다.

1

모든 정적 메서드는 로컬 변수 또는 매개 변수 만 사용하는 경우 스레드로부터 안전합니다.

1

메서드에 호출 스택이있는 것은 아니며 스레드에 호출 스택이 있음을 유의하십시오. 메소드는 스레드에 의해 호출됩니다.

메서드가 인라이닝되지 않는 한 호출하면 매개 변수를 호출 스택에 푸시 할 수 있지만 반환 주소를 확실히 호출 스택에 푸시합니다.

각 스레드 호출 스택은 다른 스레드의 호출 스택과 독립적입니다. 스택 만 액세스되는 경우이 메서드는 스레드로부터 안전합니다.

스레드 안전하지 않은 다른 저장소에 액세스 할 수 있습니다. 여기에는 정적 데이터와 인스턴스 데이터는 물론 참조 된 개체도 포함됩니다. 정적 메서드는 인스턴스 데이터에 대한 액세스 권한이 없으므로 스레드로부터 안전하게 보호됩니다. 당신은 정적 데이터에 의해 참조 정적 데이터, 또는 개체에 대한 액세스 조심해야합니다

private static int _balance; 
private static void ThreadSafetyIssues() 
{ 
    // Not thread safe 
    int temp = _balance; 
    temp ++; 
    _balance = temp; 

    // Not thread safe 
    temp = (int) HttpContext.Current.Session["balance"]; 
    temp ++; 
    HttpContext.Current.Session["balance"] = temp; 
} 

HttpContext.Current 속성은 정적이다. 즉, 모든 스레드가 Session을 포함하여 동시에 컨텍스트에 액세스 할 수 있습니다. 위의 간단한 정적 _balance 필드와 마찬가지로 스레드로부터 안전하지 않습니다.

관련 문제