代码之家  ›  专栏  ›  技术社区  ›  J. Doe

线程静态变量与实例化

  •  1
  • J. Doe  · 技术社区  · 6 年前

    如果你设定 ThreadStatic 在静态字段上,每个运行的线程都有一个单独的变量,因此如果您有 static int 字段和一个只将其值递增5倍的方法在两个单独的线程上启动该方法,只会得到两个值为5的单独整数,而不是一个值为10的整数。

    在这种情况下,这种方法与为每个线程实例化一个非静态字段有什么区别?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jon Skeet    6 年前

    ThreadStaticAttribute 装饰有:

    [AttributeUsageAttribute(AttributeTargets.Field, Inherited = false)]
    

    所以不能将其应用于方法,只能应用于字段。每个线程实际上都有一个对应于该字段的自变量。但它只能应用于静态字段——您不能有“每个实例和每个线程”字段,这是您实际需要的。

    现在是的,如果您对运行代码的线程有足够的控制,您可以为每个线程创建一个单独的对象,并使用实例字段,那么是的,这是一个很好的替代 ThreadStatic .然而,你的处境并不总是这样。有时,您需要编写可以从多个线程安全调用的代码,但不能很好地将每个线程划分为单独的对象。 线程静态 这很有用。

    话虽如此,我通常会使用 ThreadLocal<T> 而不是 线程静态 作为拥有每线程数据的替代方法。

    作为补充说明,不能有静态变量 在内部 一种方法。您只能声明 地方的 方法中的变量,它们既不是静态字段也不是实例字段-它们只是局部变量。您可以有一个仅在单个方法中使用的静态字段,但这与在方法中声明变量不同。