我正在和一个朋友辩论,他说静态构造函数可以让位于竞争条件,因为静态构造函数可以被多次调用。似乎这只能发生在大容量多线程环境中。这甚至可能吗?
我找不到任何文件来证明他错了。有人对此有任何见解吗?
谢谢!
我正在和一个朋友辩论,他说静态构造函数可以让位于竞争条件,因为静态构造函数可以被多次调用。似乎这只能发生在大容量多线程环境中。这甚至可能吗?
我找不到任何文件来证明他错了。有人对此有任何见解吗?
谢谢!
这甚至可能吗?
不会。CLR 会为您处理这个问题,并防止静态构造函数被多次调用。
这在 C# 语言规范中多次说明。例如,第 3.1 节规定:
每个应用程序域最多运行一次类型的静态构造函数。
每个 AppDomain 只调用一次静态构造函数。
ECMA-335 规定 CLI 应保证:
“对于任何给定的类型,类型初始化程序应只执行一次,除非用户代码显式调用。”
而且我还没有听说过在 C# 中调用类型初始值设定项的便捷方法。
如果您在类型初始化程序之间创建循环依赖关系,您只会遇到问题。
有关该问题的有趣文章,请参见此处:
https ://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx )