簡體   English   中英

靜態方法和IIS / asp.net中的調用堆棧

[英]static methods and the call stack in IIS/asp.net

理論問題。 如果您有100個單獨的請求到達一個aspx網頁,而該頁面調用下面的static方法。

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

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

    }

每個請求都有單獨的調用堆棧嗎?

如果是這樣-此靜態方法調用是否在這些單獨的調用堆棧中被推送?

如果是這樣,那么這些int線程安全嗎? 即。 100個請求,100個呼叫幀,300個整數。

干杯

是的,每個請求都有自己的調用堆棧。 每個堆棧都將包含它自己的query,train,tube,dir值 ,因為局部變量和方法參數存儲在堆棧中。

因此,除非您訪問某些共享狀態,否則此方法是線程安全的。

如果所有靜態方法使用的唯一變量是局部變量或參數,則它們都是線程安全的。

請注意,這並不是說方法具有調用堆棧-線程具有調用堆棧。 方法由線程調用。

除非該方法是內聯的,否則調用它可能會將參數壓入調用堆棧,但肯定​​會將返回地址壓入調用堆棧。

每個線程調用堆棧都獨立於任何其他線程的調用堆棧。 如果僅訪問堆棧,則該方法是線程安全的。

可以訪問其他存儲以使該方法不是線程安全的。 其中包括靜態數據和實例數據以及它們引用的對象。 靜態方法無權訪問實例數據,這使其更易於線程安全。 您只需要注意對靜態數據或靜態數據引用的對象的訪問:

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 與上面的簡單static _balance字段一樣,它也是非線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM