【问题标题】:static methods and the call stack in IIS/asp.netIIS/asp.net 中的静态方法和调用堆栈
【发布时间】:2010-12-05 07:54:06
【问题描述】:

理论问题。 如果您有 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 个整数。

干杯

【问题讨论】:

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


    【解决方案1】:

    是的,每个请求都有自己的调用堆栈。每个堆栈将包含它自己的 query、train、tube、dir 值,因为局部变量和方法参数存储在堆栈中。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        请注意,并不是一个方法有一个调用栈——一个线程有一个调用栈。方法由线程调用。

        除非方法是内联的,否则调用它可能会将参数压入调用堆栈,但肯定​​会将返回地址压入调用堆栈。

        每个线程调用堆栈独立于任何其他线程的调用堆栈。如果只访问堆栈,则该方法是线程安全的。

        可以访问其他存储以使该方法不是线程安全的。这包括静态数据和实例数据以及它们引用的对象。静态方法无法访问实例数据,这使得它更容易成为线程安全的。您只需要注意对静态数据或静态数据引用的对象的访问:

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

        【讨论】:

          猜你喜欢
          • 2011-09-13
          • 2020-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-12
          • 1970-01-01
          • 1970-01-01
          • 2012-11-05
          相关资源
          最近更新 更多