2013-06-28 83 views
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上等待。我试图模拟一个线程试图查询属性并执行静态构造函数并进入睡眠状态的场景,其他线程是否可以访问第二个属性并返回空值?

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

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

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

谢谢

+1

任何事情都只是线程安全的,标准AFAIK是你的静态方法应该是线程安全的。 –

+0

@GrantThomas所以​​我可以假设,除非施工完成,否则不允许线程查询某个类的属性? – Sandepku

+1

Eric Lippert在静态构造函数上做了一系列的工作。第1部分在http://ericlippert.com/2013/02/06/static-constructors-part-one/。值得一读。而且,是的,在这种情况下不需要锁。 –

回答

1

在这个例子中你应该是线程安全的。根据the Static Constructors documentation,静态构造函数'在创建第一个实例或引用任何静态成员之前自动调用',所以在构造函数完成之前应该无法引用成员。

3

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

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

+0

所以我可以假设,除非构造完成(可能由另一个线程),否则不允许线程查询类的属性? – Sandepku

+0

是的,的确如此。 –

+0

我对第二个线程是否等待第一个线程从Thread.Sleep出来之前完成构建有怀疑,欢呼声 – Sandepku