2011-02-10 15 views
10
string Get(string key){ 
    lock(_sync){ 
    // DoSomething 
    } 
} 

DoSomethingがキーのみに依存する場合、キー依存のロックが必要です。私はそれが同期オブジェクトの辞書かもしれないと思う。完全な解決策はありますか?実際の例のようにメソッドパラメータでロックする方法は?

何か What is the best way to lock cache in asp.net?

+0

ConcurrentDictionaryのような並行構造を使用してください。あなたが望むなら、私はキャッシュを提案することができます(コメントの前に@で私の名前を挙げてください)。 –

答えて

21

さて、あなたはDictionary<string, object>を作成して、怠惰にロックするオブジェクトを移入できます。たとえば:

readonly Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
readonly object dictionaryLock = new object(); 

string Get(string key) { 
    object bodyLock; 
    lock (dictionaryLock) { 
     if (!dictionary.TryGetValue(key, out bodyLock)) { 
      bodyLock = new object(); 
      dictionary[key] = bodyLock; 
     } 
    } 
    lock (bodyLock) { 
     ... 
    } 
} 

あなたが他の場所で同じようにロックする必要がある場合、私はヘルパーメソッドへの「ロックの発見」の部分を移動すると思います。 .NET 4を使用している場合、ConcurrentDictionaryはこれを簡単にすることができ、余分なロックを使用することはできません。

はこのデザインの辞書辞書です...固定キーセットはありますか(その場合は問題ありません)、それとも永遠に成長できるのでしょうか?

すでに実現しているように見えることは、キー自体をロックすることは本当に悪い考えです。等価キーは別個のオブジェクトである可能性があります。他のコードも文字列をロックすると、このコードを妨害する可能性があります。文字列のロックはほとんど常に間違っています:)

+0

コードブロックの残りの部分が意味をなされるために、行1で宣言された変数 'locks'は' dictionary'ではないでしょうか? – maxp

+0

@maxp:はい。修正されます。 –

+0

@JonSkeetキーが存在しない場合、新しいロックオブジェクトを生成するために値のファクトリを持つ 'GetOrAdd'を呼び出す' ConcurrentDictionary'を持つソリューションですか? –

関連する問題