ThreadStatic变量与instantialization

时间:2018-04-19 21:19:09

标签: c# multithreading static

如果在静态字段上设置ThreadStatic标志,则运行的每个线程都有一个单独的变量,因此如果您有一个static int字段,并且方法只是将其值增加5倍两个独立线程上的方法只会给你两个单独的整数,值为5,而不是一个值为10的整数。

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

1 个答案:

答案 0 :(得分:1)

ThreadStaticAttribute饰有:

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

所以你不能将它应用于方法,只能应用于字段。每个线程有效地具有对应于该字段的独立变量。但它只能应用于静态字段 - 你不能拥有“每个实例和每个线程”字段,这是你实际要求的。

现在是的,如果你对运行代码的线程有足够的控制权,你可以为每个线程创建一个单独的对象,而是使用实例字段,那么是的,这是一个非常好的选择到ThreadStatic。但是,这并不总是你所处的情况。有时候你需要编写从多个线程调用安全的代码,但是不能很好地将每个线程分成一个单独的对象。 ThreadStatic对此很有用。

话虽如此,我通常使用ThreadLocal<T>代替ThreadStatic作为获取每线程数据的替代方法。

作为旁注,您不能在方法中使用静态变量。您只能在方法中声明 local 变量,它们既不是静态字段也不是实例字段 - 它们只是局部变量。您可以使用仅在单个方法中使用的静态字段,但这与在方法中声明变量不同。