2013-02-17 1 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

답변

3

ObservableCollectionz<T> class의 인스턴스는 스레드로부터 안전하지 않습니다, 그래서 솔루션이 안정되지 않습니다.

Results 속성의 잠금은 한 번에 하나의 스레드 만 해당 속성을 사용할 수 있지만 ResultsUnsafe 속성은 보호하지 않습니다. Results 속성이 목록을 만드는 동안 다른 스레드는 ResultsUnsafe 속성의 컬렉션을 변경할 수 있습니다.


사이드 노트 : 정적이 아닌 데이터에 대한 잠금의 식별자로 정적 멤버를 사용하고 있습니다. 즉, 데이터를 보호하려는 인스턴스가 아닌 클래스의 모든 인스턴스에서 잠금이 액세스를 차단합니다. 정적 데이터를 보호하려면 정적 멤버를 식별자로 사용해야하며 인스턴스 데이터를 보호하려면 인스턴스 멤버를 식별자로 사용해야합니다.

관련 문제