静态类线程的公共静态成员(属性)是否安全

时间:2013-06-28 13:11:06

标签: 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.Threading.Thread.Sleep(5000);
    }

    public static string PersonName
    {
        get { return _personName; }
    }

    public static string Country
    {
        get { return _country; }
    }
}

我故意在静态构造函数中引入了Thread.Sleep。

我编写了一个示例应用程序,其中两个线程在ManualResetEvent上等待。我试图模拟一个线程试图查询属性并执行静态构造函数并进入休眠状态的情况,其他线程是否可以访问第二个属性并返回空值?

但根据我观察到的情况,第二个线程无法获取属性值,除非构造完成。

这是为我们处理的吗?或者我做错了什么?

在上面的例子中,我可以假设没有锁定来确保静态类的构造完成吗?

由于

2 个答案:

答案 0 :(得分:3)

静态构造函数是线程安全的,静态属性没有。

  

每个应用程序保证静态构造函数只运行一次   域,在创建类的任何实例之前或任何静态   成员被访问。   http://msdn.microsoft.com/en-us/library/aa645612.aspx

答案 1 :(得分:1)

在此示例中,您应该是线程安全的。基于the Static Constructors documentation,在创建第一个实例或引用任何静态成员之前自动调用静态构造函数',因此在构造函数完成之前不可能引用成员。