3

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

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

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

    }

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

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

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

干杯

4

3 回答 3

6

是的,每个请求都有自己的调用堆栈。并且每个堆栈都将包含它自己的查询、火车、管、dir值,因为局部变量和方法参数存储在堆栈中。

因此,除非您访问某些共享状态,否则此方法是线程安全的。

于 2009-10-09T12:08:57.010 回答
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这与上面的简单静态字段一样非线程安全。

于 2009-10-14T14:57:02.110 回答
1

如果静态方法使用的唯一变量是局部变量或参数,则所有静态方法都是线程安全的。

于 2009-10-09T13:15:20.593 回答