高效的读写锁-共享资源

来源:互联网 发布:路由器网络异常 编辑:程序博客网 时间:2024/06/06 19:51

字典式的并发锁

 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);        }    }