public abstract class ReadFreeCache<TKey, TValue> { protected ReadFreeCache() : this(null) { } protected ReadFreeCache(IEqualityComparer<TKey> comparer) { this.m_storage = new Dictionary<TKey, TValue>(comparer); } public abstract TValue Create(TKey key); private Dictionary<TKey, TValue> m_storage; private readonly object m_writeLock = new object(); public TValue Get(TKey key) { TValue value; if (this.m_storage.TryGetValue(key, out value)) { return value; } lock (this.m_writeLock) { if (this.m_storage.TryGetValue(key, out value)) { return value; } value = this.Create(key); var newStorage = this.m_storage.ToDictionary( p => p.Key, p => p.Value, this.m_storage.Comparer); newStorage.Add(key, value); this.m_storage = newStorage; } return value; } }
public abstract class ReadWriteCache<TKey, TValue> { protected ReadWriteCache() : this(null) { } protected ReadWriteCache(IEqualityComparer<TKey> comparer) { this.m_storage = new Dictionary<TKey, TValue>(comparer); } private readonly Dictionary<TKey, TValue> m_storage; private readonly ReaderWriterLockSlim m_rwLock = new ReaderWriterLockSlim(); protected abstract TValue Create(TKey key); public TValue Get(TKey key) { TValue value; this.m_rwLock.EnterReadLock(); try { if (this.m_storage.TryGetValue(key, out value)) { return value; } } finally { this.m_rwLock.ExitReadLock(); } this.m_rwLock.EnterWriteLock(); try { if (this.m_storage.TryGetValue(key, out value)) { return value; } value = this.Create(key); this.m_storage.Add(key, value); } finally { this.m_rwLock.ExitWriteLock(); } return value; } }
本文深入探讨了读写缓存设计模式的实现,通过两个抽象类ReadFreeCache和ReadWriteCache,展示了如何在多线程环境下高效地进行数据读取和写入操作。该模式利用了Dictionary和ReaderWriterLockSlim来确保数据的一致性和并发性能。
665

被折叠的 条评论
为什么被折叠?



