静态方法和IIS / asp.net中的调用堆栈

时间:2009-10-09 12:03:20

标签: c# asp.net iis static-methods callstack

理论问题。 如果你有100个单独的请求进入一个调用下面的静态方法的aspx网页。

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

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

    }

每个请求都有一个单独的调用堆栈吗?

如果是的话 - 这个静态方法调用是否被推送到这些单独的调用堆栈上?

如果是的话 - 因此这些整数线程安全吗?即。 100个请求,100个调用帧,300个整数。

干杯

3 个答案:

答案 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字段一样非线程安全。