在只读静态字段初始化时的线程安全性

时间:2012-08-28 12:54:35

标签: c# multithreading thread-safety

如果创建一个只读的静态成员:

public sealed class MyClass
{
    public readonly static MyClass Instance = new MyClass();
}

我们知道,如果某个线程第一次访问MyClass,静态构造函数将初始化MyClass.Instance字段。但是,如果多个线程同时访问MyClass(即静态字段线程安全的初始化),是否会创建单个实例(在本例中为MyClass)?

2 个答案:

答案 0 :(得分:21)

.NET CLR确保静态初始化始终是线程安全的。无论有多少线程访问它以及什么顺序,它总是被初始化一次。

您的代码似乎显示出Singleton模式开始的迹象 基本上,如果您想在初始化类之前运行自定义代码,那么您需要自己确保线程安全 This is an example您需要使自定义代码线程安全。但静态初始化部分始终是线程安全的。

答案 1 :(得分:8)

C#语言的规范保证类初始化是线程安全的,因此只会创建一个MyClass实例。您必须自己从那时起确保线程安全。这是MSDN参考:

http://msdn.microsoft.com/en-us/library/aa645612.aspx