【发布时间】:2013-06-28 13:11:06
【问题描述】:
我有一个示例静态类
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。我试图模拟一个线程尝试查询属性并正在执行静态构造函数并进入睡眠状态的场景,另一个线程可以访问第二个属性并返回空值吗?
但据我观察,除非构造完成,否则第二个线程无法获取属性值。
这是为我们处理的吗?还是我做错了什么?
那么我可以假设,在上述情况下,不需要锁来确保静态类的构造完成吗?
谢谢
【问题讨论】:
-
任何东西都只有你做的线程安全; AFAIK 的标准是您的静态方法 *应该* 是线程安全的。
-
@GrantThomas 所以我可以假设,除非构造完成,否则不允许线程查询类的属性?
-
Eric Lippert 做了一系列关于静态构造函数的文章。第 1 部分位于 ericlippert.com/2013/02/06/static-constructors-part-one。很值得一读。而且,是的,在这种情况下不需要锁。
标签: c# synchronization thread-safety locking static-class