-2

这是线程安全的吗?

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")
    }  
}
4

2 回答 2

2

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

  • 不 ”;” 最后TestMethod
  • 财产void?还是没有“()”的方法?
于 2013-08-22T12:15:27.947 回答
2

它是线程安全的,因为AcceptedItems它保证在 TestMethod 中访问该字段之前被设置。静态字段初始化器在包含类型的静态构造函数中执行,保证在类的任何实例生成之前执行,即 beforeBuildSomething()被调用,以及在访问任何其他静态字段之前,即 beforeTestMethod()被调用。

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

于 2013-08-22T12:18:41.143 回答