我有以下的輔助類(簡體):我可以擺脫此讀鎖嗎?
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
將被調用的應用程序大致10/100倍和Lookup
將多個線程調用,許多十萬次。我想要的是擺脫讀鎖。
在這種情況下,您通常如何擺脫讀鎖?
我有以下觀點:
要求
_lookup
穩定的應用程序開始操作之前。可以從Attribute
建立起來。這是通過屬性分配給的靜態構造函數自動完成的。要求上述要求我通過所有可能具有該屬性並且呼叫RuntimeHelpers.RunClassConstructor
這是昂貴的操作的類型;移至COW語義。
public static void Add(Type type, string value) { lock (_syncRoot) { var lookup = new Dictionary<Type, string>(_lookup); lookup.Add(type, value); _lookup = lookup; } }
(隨着
lock (_syncRoot)
在Lookup
方法除去。)這種方法的問題是,這種使用的存儲器的不必要的量(這可能不會成爲一個問題),我可能會使_lookup
揮發性的,但我我不知道這應該如何應用。 (John Skeets' comment here gives me pause.)- 使用
ReaderWriterLock
。我相信這會讓事情變得更糟,因爲該地區被鎖定的很小。
建議是非常受歡迎的。
UPDATE:
緩存的值是不可改變的。
您無法使用.NET 4及其中的併發集合嗎? – 2011-01-11 06:34:34
對不起,.NET 2.0。 – 2011-01-11 06:49:08