理论问题。 如果你有100个单独的请求进入一个调用下面的静态方法的aspx网页。
public static GeocodeResult GeocodeQuery(string query)
{
int train, tube, dlr = 0;
// manipulate these ints
if (train)
{
// do something important
}
}
每个请求都有一个单独的调用堆栈吗?
如果是的话 - 这个静态方法调用是否被推送到这些单独的调用堆栈上?
如果是的话 - 因此这些整数线程安全吗?即。 100个请求,100个调用帧,300个整数。
干杯
答案 0 :(得分:6)
是的,每个请求都有自己的调用堆栈。并且每个堆栈将包含它自己的查询,train,tube,dir 的值,因为局部变量和方法参数存储在堆栈中。
因此,除非您访问某些共享状态,否则此方法是线程安全的。
答案 1 :(得分:1)
如果它使用的唯一变量是局部变量或参数,则所有静态方法都是线程安全的。
答案 2 :(得分: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
字段一样非线程安全。