字典式的并发锁
public abstract class ReaderWriterCache<TKey, TValue>
{
private readonly Dictionary<TKey, TValue> _cache;
private readonly ReaderWriterLock _rwLock = new ReaderWriterLock();
protected ReaderWriterCache()
: this(null)
{
}
protected ReaderWriterCache(IEqualityComparer<TKey> comparer)
{
_cache = new Dictionary<TKey, TValue>(comparer);
}
protected Dictionary<TKey, TValue> Cache
{
get
{
return _cache;
}
}
protected void Clear()
{
_rwLock.AcquireWriterLock(Timeout.Infinite);
try
{
_cache.Clear();
}
finally
{
_rwLock.ReleaseWriterLock();
}
}
protected TValue FetchOrCreateItem(TKey key, Func<TValue> creator)
{
_rwLock.AcquireReaderLock(Timeout.Infinite);
try
{
TValue existingEntry;
if (_cache.TryGetValue(key, out existingEntry))
{
return existingEntry;
}
}
finally
{
_rwLock.ReleaseReaderLock();
}
TValue newEntry = creator();
_rwLock.AcquireWriterLock(Timeout.Infinite);
try
{
TValue existingEntry;
if (_cache.TryGetValue(key, out existingEntry))
{
return existingEntry;
}
_cache[key] = newEntry;
return newEntry;
}
finally
{
_rwLock.ReleaseWriterLock();
}
}
}
共享资源放到类的私有静态变量中
internal class GeneratorStoreTypeCache:ReaderWriterCache<string,Type>
{
//方法 GetDiscriptor 反正就是获取Type的描述信息
}
internal static class TypeCache
{
private readonly static GeneratorStoreTypeCache generatorStoreTypeCache = new GeneratorStoreTypeCache();
public static GeneratorStoreTypeDiscriptor GetTypeDiscriptor(Type generatorStoreType)
{
return generatorStoreTypeCache.GetDiscriptor(generatorStoreType);
}
}