在多线程应用程序中使用静态变量是否安全?

时间:2014-06-03 05:40:12

标签: c#

我有一个多线程应用程序,它运行一个包含public static variable的方法。 我想知道这个public static variable是否与每个线程是分开的。 是否可以通过其他线程更改值?

3 个答案:

答案 0 :(得分:6)

它不是线程安全的。

static个变量存在于AppDomain的生命周期中。除非它是constreadonly ..然后它们可以被应用程序中的任何线程变异。

答案 1 :(得分:2)

如果您希望静态变量分开,则每次使用TreadLocal<T>类。例如让我们Random默认情况下不是线程安全的)是线程安全的:

  public class Sample {
    private static ThreadLocal<Random> s_Generator = new ThreadLocal<Random>(
       () => new Random());

    public static Random Generator {
      get {
        return s_Generator.Value;
      }
    }

答案 2 :(得分:1)

static个变量由所有应用程序线程共享。实际上,这是在线程之间共享状态的一种方式。

您可以通过使用ThreadStatic属性进行装饰来创建一个静态变量thread-local(即每个线程将有一个单独的变量副本)。例如:

class WithThreadStatic
{
    [ThreadStatic] 
    public static bool IsSad = true;
}