2013-08-22 71 views
-1

這是線程安全嗎?ThreadSafe屬性

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") 
    } 
} 
+0

如果使用.Net 4或更新版本,請查看使用許多併發收集類之一,它們專門用於幫助線程安全。 –

+1

這是線程安全的,除非修改'AcceptedItems'在其他線程被修改 –

回答

2

這是線程安全的,因爲AcceptedItems字段保證在TestMethod中訪問它之前被設置。靜態字段初始化器在包含類型的static constructor中執行,其保證在任何實例由類構成之前,即在調用BuildSomething()之前以及在訪問任何其他靜態字段之前(即在調用TestMethod()之前)執行。

除此之外,只要AcceptedItems字段在訪問時未被修改,則可以安全地從多個線程訪問List<T>。您應該知道,將該字段標記爲readonly並不會阻止任何人修改列表的內容,因此如果您的代碼在AcceptedItems.Add(item)AcceptedItems.Remove(item)或其他任何類似的代碼中,那麼您可能會收到異常,如果發生這種情況時不同的線程也在同一個列表上工作。

3

以及它甚至沒有編譯....

  • 沒有 「;」在TestMethod的末尾
  • a void屬性?或沒有「()」的方法?
+0

@dtb我會刪除該評論 –