2011-02-01 9 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

@ティムウィー:ちょっとティム、彼らは私の解決策に関連している。私はデリゲートのハッシュを保持しているシングルトンを使ってスレッドセーフティを前提にして質問を続けています。上記のコードはそれを伝えないかもしれませんが、handler [0]への参照はProperyManagerで設定されます。これは、シングルトンのCreate()関数を呼び出したスレッドによって使用されます。 – Amit

0

コンストラクタの完了後に辞書の値を決して変更しないと仮定すると、それは問題ありません。 Dictionary<TKey, TValue>は、ライターが存在しない限り、複数のリーダーをサポートします。

関連する問題