ThreadSafe属性

时间:2013-08-22 12:09:47

标签: c# .net thread-safety

这线程安全吗?

public class TestPage
{ 
    private static readonly IList<string> AcceptedItems = new List<string>() { "FOO" };

    protected void BuildSomething
    {
       TestMethod();
    }

    public static void TestMethod()
    {
       var ok = AcceptedItems.Contains("FOO")
    }  
}

2 个答案:

答案 0 :(得分:2)

好吧,它甚至没有编译......

  • 没有“;”在TestMethod
  • 的末尾
  • 一个void财产?或没有“()”的方法?

答案 1 :(得分:2)

它是线程安全的,因为AcceptedItems字段保证在TestMethod中访问之前设置。静态字段初始值设定项在包含类型的static constructor中执行,保证在任何实例构成之前执行,即在调用BuildSomething()之前,在访问任何其他静态字段之前执行,即在调用TestMethod()之前。

除此之外,只要List<T>字段在被访问时未被修改,就可以安全地从多个线程访问AcceptedItems。您应该知道,将字段标记为readonly并不会阻止任何人修改列表的内容,因此如果您在其他地方有AcceptedItems.Add(item)AcceptedItems.Remove(item)或类似的代码,然后,如果在不同线程上的代码也在同一列表上运行时,您可能会遇到异常。