【问题标题】:Are public static members (properties) of static class thread safe静态类线程的公共静态成员(属性)是否安全
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 所以我可以假设,除非构造完成(可能由另一个线程),否则不允许任何线程查询类的属性??
  • 我怀疑第二个线程是否在第一个线程从 Thread.Sleep 出来之前等待构造完成,干杯
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多