Tag: 静态初始化

C#中静态初始化程序的线程安全性

每个人都说静态初始化程序是线程安全的,但我担心一个特定的细节。 比方说我有 static class MyStaticClass { public static readonly object myField = MyOtherClass.GetNewObject(); } static class MyOtherClass { public static object GetNewObject() { /* arbitrary code that returns a new object */ } } 当MyStaticClass.myField尚未初始化时,C#保证以下哪一项? 如果线程1和2尝试一起访问myField ( GetNewObject顺序),则在线程2读取myField之前, GetNewObject将开始执行。 如果线程1和2尝试一起访问myField ( GetNewObject顺序),则在线程2读取myField之前, GetNewObject将完成执行。 一般来说CLR怎么样:如果它的保证与C#不同,它们在哪些方面有所不同? 在更新版本的.NET框架中是否更改了行为? 注意: 这是一个棘手的问题,我认为完整的答案可能会提到静态构造函数和静态初始化程序之间的区别,以及它们如何与beforefieldinit交互以产生声明的结果。