私は、次のヘルパークラス(簡体字)があります。この読み取りロックを取り除くことはできますか?
public static class Cache
{
private static readonly object _syncRoot = new object();
private static Dictionary<Type, string> _lookup = new Dictionary<Type, string>();
public static void Add(Type type, string value)
{
lock (_syncRoot)
{
_lookup.Add(type, value);
}
}
public static string Lookup(Type type)
{
string result;
lock (_syncRoot)
{
_lookup.TryGetValue(type, out result);
}
return result;
}
}
Add
は何千回もの多くは、アプリケーションおよびLookup
でおよそ10/100回は多くのスレッドによって呼び出されると呼ばれます。私が望むのは、読み取りロックを取り除くことです。
通常この状況では、どのように読み取りロックを解除しますか?
私は、次のアイデアを持っている:
は、アプリケーションが動作を開始する前に
_lookup
が安定していることを要求します。Attribute
からビルドすることができます。これは、属性が割り当てられている静的コンストラクターによって自動的に行われます。上記を要求するには、属性を持つ可能性のあるすべての型を調べて、高価な操作であるRuntimeHelpers.RunClassConstructor
を呼び出す必要があります。COWセマンティクスに移動します。 (
Lookup
方法で削除lock (_syncRoot)
付き。)public static void Add(Type type, string value) { lock (_syncRoot) { var lookup = new Dictionary<Type, string>(_lookup); lookup.Add(type, value); _lookup = lookup; } }
これに伴う問題は、これが(問題ではないかもしれません)メモリの不必要な量を使用して、私はおそらく
_lookup
は揮発性になるだろうということですが、私これをどのように適用すべきかわかりません。 (John Skeets' comment here gives me pause.)- を使用する。私は、ロックされている領域が小さいため、これにより状況が悪化すると思います。
提案は大歓迎です。
UPDATE:キャッシュの
値は不変です。現時点では仕事で
.NET 4およびその中のコンカレントコレクションを使用できませんか? –
申し訳ありません、.NET 2.0。 –