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

web*_*ber 5 c# static-constructor race-condition

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

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

谢谢!

Ree*_*sey 12

这甚至可能吗?

不会.CLR会为您处理此问题,并防止静态构造函数被多次调用.

这在C#语言规范中多次拼写出来.例如,第3.1节规定:

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

  • @Tergiver:我想你们两个正在相互交谈.在C#程序中,两个线程上的竞争是否可能导致其中一个在另一个线程之前运行cctor?是.该种族是否有可能造成僵局?是.两个线程是否有可能竞争,因为它们*同时在cctor中结束*,然后在cctor中的代码中进行比赛?没有; 锁可以防止这种情况. (6认同)
  • @Tergiver我正在解决OP的声明"可以让位于竞争条件,因为静态构造函数可以被多次调用" - 总是可以在任何地方以任何代码创建自己的竞争条件.没有线程安全保证,但规范DOES提供了一个保证静态构造函数只会被调用一次,所以*特定的竞争条件*潜力不存在. (3认同)

Bot*_*000 4

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

“除非由用户代码显式调用,否则对于任何给定类型,类型初始值设定项都应执行一次。”

我还没有听说过在 C# 中调用类型初始值设定项的便捷方法。

仅当您在类型初始值设定项之间创建循环依赖关系时,才可能遇到问题。
请参阅此处有关该问题的有趣文章:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-in ​​itializer-circular-dependency.aspx )

  • @AenSidhe因为它们是不同的类型,所以它不是相同的静态构造函数。将类型参数(例如 int 或 string)应用于 List<T> 后,就会创建一个封闭类型。不同的类型也都有自己的静态变量集。开放类型List<T>的静态构造函数不会被调用。有关详细信息,请参阅 [C# 规范](http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc) 的第 4.4.2 节信息。 (2认同)