如果一个人像这样创建一个只读静态成员:
public sealed class MyClass
{
public readonly static MyClass Instance = new MyClass();
}
我们知道,如果某个线程第一次访问 MyClass,静态构造函数将初始化 MyClass.Instance 字段。但是,如果多个线程都同时访问 MyClass(即静态字段的初始化是否线程安全),是否会创建单个实例(在本例中为 MyClass)?
如果一个人像这样创建一个只读静态成员:
public sealed class MyClass
{
public readonly static MyClass Instance = new MyClass();
}
我们知道,如果某个线程第一次访问 MyClass,静态构造函数将初始化 MyClass.Instance 字段。但是,如果多个线程都同时访问 MyClass(即静态字段的初始化是否线程安全),是否会创建单个实例(在本例中为 MyClass)?
.NET CLR 确保静态初始化始终是线程安全的。不管有多少线程在访问它,以什么顺序访问它,它总是会被初始化一次。
您的代码似乎显示出单例模式开始的迹象。
基本上,如果您想在初始化类之前运行自定义代码,那么您需要自己确保线程安全。
这是一个您需要使自定义代码线程安全的示例。但是静态初始化部分始终是线程安全的。
C#语言规范保证类初始化是线程安全的,因此只会MyClass
创建一个实例。从那时起,您必须自己确保线程安全。这是一个 MSDN 参考: