静态初始化器和线程同步(.NET)

时间:2009-06-25 17:25:42

标签: .net multithreading static initialization static-initializer

静态初始化器应该在第一次引用类之前执行一次。这意味着每次访问类时,都应检查是否执行了类的静态初始化程序 似乎在具有非平凡静态初始值设定项的多线程环境类中,由于多个线程访问类时需要同步,因此可能会成为争用源。 我的问题是什么是最小化这种隐式锁对静态初始化器引入的类定义的影响的最佳方法?

4 个答案:

答案 0 :(得分:1)

我认为没有太多争论。初始化程序在加载类时运行。如果已经加载了类,则不必进行任何检查。

答案 1 :(得分:1)

静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

  • 创建了一个类的实例。
  • 引用该类的任何静态成员

在调用静态构造函数时,应该负责类加载器处理并发问题。

答案 2 :(得分:0)

规范说“在首次使用该类的静态字段之前,在执行相关时间执行。”。

因此,人们可以假设(或者希望你是否悲观)实现已经发现他们需要关心线程同步。

答案 3 :(得分:0)

我相信这是JIT编译的一部分。一旦静态初始化程序被jitted并运行,它就不再需要运行它,因此多线程没有同步问题。当然,JIT引擎将是线程安全的。

尼克。