C# 静态类的公共静态成员(属性)是线程安全的吗
我有一个示例静态类C# 静态类的公共静态成员(属性)是线程安全的吗,c#,synchronization,thread-safety,locking,static-class,C#,Synchronization,Thread Safety,Locking,Static Class,我有一个示例静态类 public static class SampleClass { private static readonly string _personName; private static readonly string _country; static SampleClass() { _personName = "JourneyMan"; _country = "Zee"; System.T
public static class SampleClass
{
private static readonly string _personName;
private static readonly string _country;
static SampleClass()
{
_personName = "JourneyMan";
_country = "Zee";
System.Threading.Thread.Sleep(5000);
}
public static string PersonName
{
get { return _personName; }
}
public static string Country
{
get { return _country; }
}
}
我特意引入了一个线程。在静态构造函数中睡眠
我编写了一个示例应用程序,其中两个线程等待ManualReset事件。我试图模拟这样一个场景:一个线程试图查询一个属性,正在执行静态构造函数,然后进入睡眠状态,另一个线程能否访问第二个属性并返回null值
但是根据我观察到的情况,除非构造完成,否则第二个线程无法获取属性值
这是为我们处理的吗?还是我做错了什么
所以我可以假设,在上述情况下,不需要锁来确保静态类的构造是完整的吗
谢谢静态构造函数是线程安全的,静态属性没有 静态构造函数保证每个应用程序只运行一次 域,在创建类的任何实例或任何静态 可以访问成员。
静态构造函数是线程安全的,静态属性号为 静态构造函数保证每个应用程序只运行一次 域,在创建类的任何实例或任何静态 可以访问成员。
在本例中,您应该是线程安全的。基于静态构造函数“在创建第一个实例或引用任何静态成员之前自动调用”,因此在构造函数完成之前不可能引用成员。在本例中,您应该是线程安全的。基于静态构造函数,“在创建第一个实例或引用任何静态成员之前自动调用”,因此在构造函数完成之前,不可能引用成员。任何事情都是线程安全的;标准是,AFAIK,您的静态方法*应该*是线程安全的。@GrantThomas所以我可以假设,除非构造完成,否则任何线程都不允许查询类的属性?Eric Lippert做了一系列关于静态构造函数的研究。第1部分在。很值得一读。而且,是的,这种情况下不需要锁。任何东西都是线程安全的;标准是,AFAIK,您的静态方法*应该*是线程安全的。@GrantThomas所以我可以假设,除非构造完成,否则任何线程都不允许查询类的属性?Eric Lippert做了一系列关于静态构造函数的研究。第1部分在。很值得一读。而且,是的,在这种情况下不需要锁。因此我可以假设,除非构造由另一个线程完成,否则任何线程都不允许查询类的属性??我怀疑第二个线程是否会在第一个线程退出线程之前等待构造完成。睡眠,谢谢,我可以假设,除非构造完成,否则任何线程都不允许查询类的属性。可能是由另一个线程完成的??我怀疑第二个线程是否会在第一个线程退出之前等待构造完成。睡眠,干杯