2011-02-01 7 views
1

IPropertyMapper 객체를 생성하는 싱글 톤 팩토리가 필요합니다. 팩토리에는 Func 대리자에 대한 참조를 보유하는 사전이 있습니다. 사전은 불변이고, 나는 단지 빠른 접근을 원한다. 이 코드는 스레드로부터 안전합니까? Create() 스레드를 안전하게 호출하고 있습니까?싱글 톤 팩토리 멤버 함수 스레드 안전성

클래스 정의 :

public sealed class PropertyMapperFactory 
    { 
     private static readonly PropertyMapperFactory _instance = new PropertyMapperFactory(); 

     private readonly Dictionary<int, Func<TResult>> _handlers; 

     private PropertyMapperFactory() { 
      this._handlers = new Dictionary<...>(); 
      this._setTimeHandler(); 
     } 

     public static PropertyMapperFactory GetFactory() { 
      return _instance; 
     } 

     //Is this thread safe? 
     public IPropertyMapper Create(UnitSetting _units) { 
      return new PropertyMapper(this.handler[0]) 
     }    

답변

1

Dictionary<TKey, TValue> 유형은 일반적으로 에 안전한 것으로 간주 동시 스레드에서를 읽을 수 있지만 모든 작업이 다른 쓰기 (완전히 격리해야합니다 작성하는 것이 - 또는 읽기 -에서 동시). 구성 후 언제든지 사전을 수정하지 않으면 OK입니다.

+0

안녕하세요 아담, 답변 해 주셔서 감사합니다. 내 대리자 함수는 다음과 같이 정의됩니다. Func ((target) => {return target.toString()}) ;. 내 대리인은 현재 스레드 스택에서도 실행됩니까? 이것은 공유 변수/함수 ptr이기 때문에 동기화 프리미티브가 필요합니까? – Amit

+0

@Amit : 관련없는 별도의 질문이있는 경우 별도의 질문을 게시하십시오. 의견에서 관련없는 질문을하지 마십시오. – Timwi

+0

@Timwi : 안녕하세요, 그들은 내 해결책과 관련이 있습니다. 나는 스레드 안전성을 전제로하여 위임자의 해시를 보유한 싱글 톤에 대한 질문을 계속하고있다. 위의 코드는이를 전달할 수는 없지만 handler [0]에 대한 참조는 ProtonyManager에서 설정되며, 이는 Singleton의 Create() 함수를 호출 한 스레드가 사용합니다. – Amit

0

생성자가 완료된 후에도 사전에 값을 변경하지 않는다고 가정하면 좋습니다. Dictionary<TKey, TValue>은 작성자가없는 한 여러 독자를 지원합니다.

관련 문제