c#静态构造函数中的竞争条件

时间:2012-04-10 21:34:06

标签: c# race-condition static-constructor

我正和一位朋友辩论,他说静态构造函数可以让位于竞争条件,因为静态构造函数可以被多次调用。似乎这只能在高容量多线程环境中发生。这甚至可能吗?

我找不到任何证明他错的文件。有没有人对此有任何见解?

谢谢!

2 个答案:

答案 0 :(得分:12)

  

这甚至可能吗?

没有。 CLR为您处理此问题,并防止静态构造函数被多次调用。

这在C#语言规范中多次拼写出来。例如,3.1节说明:

  

每个应用程序域最多运行一次类型的静态构造函数。

答案 1 :(得分:3)

每个AppDomain只调用一次静态构造函数 ECMA-335规定CLI应保证:

  

“对于任何给定类型,类型初始值设定项应该只执行一次,   除非用户代码明确调用。“

我还没有听说过用C#调用类型初始化器的简便方法。

如果在Type初始值设定项之间创建循环依赖关系,则只会遇到问题 请看这里有关该问题的有趣文章:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx