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部分在。很值得一读。而且,是的,在这种情况下不需要锁。因此我可以假设,除非构造由另一个线程完成,否则任何线程都不允许查询类的属性??我怀疑第二个线程是否会在第一个线程退出线程之前等待构造完成。睡眠,谢谢,我可以假设,除非构造完成,否则任何线程都不允许查询类的属性。可能是由另一个线程完成的??我怀疑第二个线程是否会在第一个线程退出之前等待构造完成。睡眠,干杯