2012-11-16 12 views
0

我是C#中多線程的新手。但是閱讀C#書籍和教程中的各章。我知道開發用於多線程應用程序的類的最佳方法是創建不可變類。C# - 多線程 - 如何應用於具有讀/寫屬性的對象

但我不太確定如何處理暴露讀/寫屬性的類。在我讀過的一些文章中,作者已經在讀/寫屬性周圍放置了鎖,例如

public class Test 
{ 
    private string property1; 

    public string ClassProperty 
    { 
    get 
    { 
    lock 
    { 
     return Property1; 
    } 
    } 
    set 
    { 
     lock 
     { 
     Property1 = value; 
     } 
    } 
} 
} 

我知道,任何共享變量聲明和使用在一個類內,它需要鎖定在多線程應用程序。但是我讀過的一些文章建議,如果被暴露的屬性是引用類型,上面的代碼將不起作用。其他人建議你不能使用暴露的屬性線程安全的類?有沒有人有關於這個話題的明確答案?

謝謝

+1

我推薦你閱讀這個免費的電子書:[Albahari](http://www.albahari.com/threading/) –

+0

你從哪裏得到這樣的想法,即不可變類是最好的方法?我想在一個有狀態的多線程應用程序中,不可變類可能是一場噩夢! –

回答

2

該代碼示例除了增加開銷之外不執行任何操作。無論如何,C#字符串對象本身都是線程安全的,指針讀/寫總是原子的。該代碼示例只對double或struct有意義。

您不應該考慮將各個屬性設置爲線程安全的,而應該將大型邏輯操作設爲「原子」。例如,如果你有兩個字段foo和bar,並且它必須始終是bar ==小寫(foo)的情況,那麼你應該保護使用同一個鎖訪問它們的操作。

一個更好的例子是必須被包含在兩個向量和散列的對象:

  • 當添加你應該鎖定兩個向量和散列和下鎖更新兩者。
  • 當查詢你應該鎖定哈希值時,取值,解鎖並返回它。
  • 迭代時,您應該返回矢量的副本或確保調用者瞭解您的鎖定模式。
0

引用類型的問題是你只鎖定獲取引用。在引用類型之後,可以以不安全的方式訪問類型成員,除非該類型本身支持線程安全。

相關問題