2

我有一个示例静态类

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。我试图模拟一个线程尝试查询属性并正在执行静态构造函数并进入睡眠状态的场景,另一个线程可以访问第二个属性并返回空值吗?

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

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

那么我可以假设,在上述情况下,不需要锁来确保静态类的构建完成吗?

谢谢

4

2 回答 2

3

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

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

于 2013-06-28T13:14:25.483 回答
1

在这个例子中你应该是线程安全的。根据静态构造函数文档,静态构造函数“在创建第一个实例或引用任何静态成员之前自动调用”,因此在构造函数完成之前应该不可能引用成员。

于 2013-06-28T13:15:16.267 回答