1

静态初始化器应该在第一次引用类之前执行一次。这意味着每次访问某个类时,都应该执行检查,以确定是否执行了该类的静态初始化程序。
看来,在多线程环境中,具有非平凡静态初始值设定项的类可能成为争用的来源,因为当多个线程访问该类时需要进行同步。
我的问题是最大限度地减少这种隐式锁对由静态初始化器引入的类定义的影响的最佳方法是什么?静态初始化器和线程同步(.NET)

回答

1

静态构造的执行由第一以下事件到应用程序域内发生触发:

  • 创建类的实例。
  • 任何类的静态成员被引用

它应该是类加载器的责任,需要静态构造函数时处理并发问题。

1

我不认为有太多的争议。初始化器在类加载时运行。如果该类已经加载,则不需要进行检查。

+0

好吧...新产生的线程如何知道该类已被加载?它仍然需要与中心人士进行交流才能找到答案。 – kolosy 2009-06-25 17:51:38

+2

这是虚拟机的责任。如果虚拟机没有任何聪明的技巧/为了实现这一点而锁定,我不想开发一个单一的.NET应用程序。 – nos 2009-06-25 18:00:19

0

规范说“在第一次使用该类的静态字段之前,在执行相关时间执行”。因此,人们可以假设(或者希望如果你是悲观的)实现已经发现他们需要关心线程同步。

0

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

Nick。