[英]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.