2013-02-17 50 views
2

此模式似乎正在爲我在此線程不安全環境中實現線程鎖定而工作。但是在模式和最佳實踐方面(尤其是我自己已經想清楚了),我並沒有過度暴露兩個收集相同結果的集合。但是不安全的集合需要公開地公開暴露,我不想將其隱藏起來並具有「AddResult(x)」方法。線程不安全對象中的此鎖定模式有什麼問題嗎?

這是解決此問題的正確方法嗎?

public class UnsafeObject 
{ 
    public ObservableCollection<HighSpeedObject> ResultsUnsafe { get; set; } 

    /// Accessed by UI thread once every 100ms 
    public List<HighSpeedObject> Results 
    { 
     get 
     { 
      lock (_padlock) 
      { 
       return ResultsUnsafe.ToList(); 
      } 
     } 
    } 

    private readonly static object _padlock = new object(); 
} 
+1

鎖定會導致併發操作序列化。 – Oded 2013-02-17 21:57:32

回答

3

ObservableCollectionz<T> class的實例不是線程安全的,因此您的解決方案不穩定。

Results屬性中的鎖只確保一次一個線程可以使用該屬性,但它不能保護ResultsUnsafe屬性。其他線程可以更改ResultsUnsafe屬性中的集合,而Results屬性正在從中創建列表。


旁註:你正在使用一個靜態成員作爲標識用於非靜態數據的鎖。這意味着該鎖將阻止在該類的所有實例中進行訪問,而不僅僅是要保護的數據實例。爲了保護靜態數據,您應該使用靜態成員作爲標識符,並且爲了保護實例數據,您應該使用實例成員作爲標識符。