关于ConcurrentQueue--一个队列缓存的设计
2013-05-21 16:24
183 查看
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections.Concurrent; namespace PDAJob.PDAService.Service { public class CacheList<T> { private int MaxSize = 10000; private int ShrinkLen = 2000; private ConcurrentQueue<CacheItem<T>> _Queue = new ConcurrentQueue<CacheItem<T>>(); public CacheList(int maxSize,int shrinkLen) { this.MaxSize = maxSize; this.ShrinkLen = shrinkLen; } public void Add(T item) { #region 超过则收缩 if (_Queue.Count >= MaxSize) { lock (this) { if (_Queue.Count >= MaxSize) { CacheItem<T> outItem; for (int i = 0; i < ShrinkLen; i++) { _Queue.TryDequeue(out outItem); } } } } #endregion _Queue.Enqueue(new CacheItem<T>() { Data = item, AddTime = DateTime.Now }); } public ConcurrentQueue<CacheItem<T>> Queue { get { return _Queue; } } } /// <summary> /// 缓存内容 /// </summary> /// <typeparam name="T"></typeparam> public class CacheItem<T> { public DateTime AddTime { get; set; } public T Data { get; set; } } }
View Code
在多线程环境下可能多个Thread读到Queue.Count>MaxSize,虽然Queue是Thread安全的,但是上面的代码可造成_Queue被重复移空,所以要加lock
相关文章推荐
- 一个关于进度管理的功能模块设计
- 关于一个Java帮助系统的设计
- iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)
- 《软件架构与设计模式》关于 抽象工厂模式 的一个小例子
- 架构设计:生产者-缓存队列-消费者(4)
- 这也是我在做一个项目是找的关于网站后台权限设计
- 蛙蛙推荐:设计一个高效的缓存管理服务
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于查询缓存的一个思考
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 设计一个移动应用的本地缓存机制
- 设计一个高效的缓存管理服务
- 关于一个多线程类的设计方法
- 架构设计:生产者-缓存队列-消费者(5)
- 设计一个iOS应用的本地缓存机制
- 程序员面试金典: 9.3栈与队列 3.2设计一个栈,除pop与push方法,支持返回栈最小元素min方法,时间复杂度均为O(1)
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- (转)关于TCP的一个跨层设计的 具体实现思路 (兼讨论 tcl.eval与Tcl_Eval的区别)