静态初始值设定项和线程同步(.NET)

静态初始值设定项和线程同步(.NET),.net,multithreading,static,initialization,static-initializer,.net,Multithreading,Static,Initialization,Static Initializer,静态初始值设定项应该在第一次引用类之前执行一次。这意味着每次访问一个类时,都应该检查是否执行了该类的静态初始值设定项。 似乎在多线程环境中,具有非平凡静态初始值设定项的类可能会成为争用源,因为当多线程访问该类时,必须进行同步。 我的问题是,怎样才能最大限度地减少此类隐式锁对静态初始值设定项引入的类定义的影响?我认为没有太多争议。初始化器在类加载时运行。如果类已经加载,则不必进行任何检查。规范中说“在第一次使用该类的静态字段之前,在依赖于实现的时间执行。” 因此,我们可以假设(或者,如果您对此持悲

静态初始值设定项应该在第一次引用类之前执行一次。这意味着每次访问一个类时,都应该检查是否执行了该类的静态初始值设定项。
似乎在多线程环境中,具有非平凡静态初始值设定项的类可能会成为争用源,因为当多线程访问该类时,必须进行同步。

我的问题是,怎样才能最大限度地减少此类隐式锁对静态初始值设定项引入的类定义的影响?

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

规范中说“在第一次使用该类的静态字段之前,在依赖于实现的时间执行。”


因此,我们可以假设(或者,如果您对此持悲观态度的话,我们希望)实现已经发现他们需要关心线程同步。

我相信这是JIT编译的一部分。一旦静态初始值设定项被JIT并运行,它就不再需要运行它,因此不会出现多线程的同步问题。当然,JIT引擎将是线程安全的


尼克。

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

  • 将创建该类的一个实例
  • 类的任何静态成员都被引用

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

。。。新生成的线程如何知道类已经加载?它仍然需要与某个中心进行对话才能找到答案。这是虚拟机的责任。如果虚拟机没有任何聪明的技巧/锁定来实现这一点,我永远也不想开发一个.NET应用程序。虚拟机保留一个它已经加载的类的列表。当需要对某个类执行操作时,vm会查看列表以查看是否已加载该类。如果是这样,静态初始值设定项甚至从未发挥作用。如果没有,类加载器将接管并调用初始值设定项。我更倾向于“希望”。正如罗纳德·雷根(Ronald Reigan)过去常说的“doverjaj no proverjaj”,或者,用英语说,信任,但验证。您能想出任何方法来验证静态初始值设定项不应该引起关注吗?