从多个线程访问全局变量或静态函数是否存在危险?

时间:2017-03-21 20:00:00

标签: c#

假设我有一个带有全局变量的类,一个方法和几个线程。

    class Class
    {
      public var Var1;

      piblic mainFoo()
      {
          thread1.start(thread_foo1);
          thread2.start(thread_foo2);
      }
      public void Foo(var1, var2, var3)
      {
       ...
      }

      private thread_foo1()
      {

        if(Var1) {}
        Foo(_var1,_var2,_var3);

      }

      private thread_foo2()
      {

        if(Var1) {}
        Foo(_var1,_var2,_var3);

      }

    }

除主线程外,Var1不会改变。 Foo不会改变任何线程中的任何数据,它只是一些我不想重复的小公共代码。这个结构会导致线程中出现任何问题或冲突吗?

1 个答案:

答案 0 :(得分:1)

这取决于全局变量的类型。

1)全局变量是值类型

2)全局变量是引用类型

  • 保证参考分配是原子的,因此可以从任何线程安全地完成分配
  • 如果type是不可变的或无状态的,您可以假设从其他线程读取是安全的(例如string
  • 如果确保类型是线程安全的,您可以假设从其他线程读取是安全的(例如ConcurentDictionary
  • 否则读取(或更准确地通过变量的属性访问内部状态)是不安全的,因为任何逻辑变量的属性在从其他线程读取时可能导致内部状态不一致(例如Dictionary