用空间做网站如何做好安全,郴州市,中国著名的外贸公司,自创图片软件前言大家好#xff0c;我是阿辉。上一篇博文简单介绍了C#中支持并发的数据字典#xff0c;简单举例说明比较了常规集合与ConcurrentDictionary的读写速度。下来简单介绍其中一个线程安全队列ConcurrentQueue;ConcurrentQueue队列我们不陌生#xff0c;在数据结构这门课中就有… 前言大家好我是阿辉。上一篇博文简单介绍了C#中支持并发的数据字典简单举例说明比较了常规集合与ConcurrentDictionary的读写速度。下来简单介绍其中一个线程安全队列ConcurrentQueue;ConcurrentQueue队列我们不陌生在数据结构这门课中就有了解过是一种先进先出的对象集合。平时在我们需要对各项拥有先进先出的访问时就需要使用队列来实现当像队列里面添加元素时叫入队移除元素时叫出队。ConcurrentQueue是一个高效的线程安全的队列是.Net Framework4.0 Collections.Concurrent命名空间下的一个数据结构。实现原理在普通的非线程安全队列中有两种实现方式一是使用数组实现循环队列。二是使用链表实现队列。这两种实现方式都不适合多线程使用数组实现的当队列存储满的话无法继续存储扩容困难需要重新开辟新空间内存开销过大。尤其是在并发的程序中对程序性能很受影响。使用链表的实现方式虽然消除了空间浪费但是增加了GC的压力当入队时会分配一个新节点出队时需要废弃性能不高。而对于ConcurrentQueue而言它使用了分段存储的概念ConcurrentQueue分配内存时以段(Segment)为单位里面有对应的指针和初始的长度数组。这种分配内存的实现方式不但减轻GC的压力而且调用者不需要实时显示的调用TrimToSize()来回收内存。在某段内存为空的时候GC会主动回收。class Program{ static int value 0;private static ConcurrentQueueint CustomQueue new ConcurrentQueueint(); //线程安全的队列static void Main(string[] args){Console.WriteLine(队列中的元素 入队 两个线程都入队); Thread oneThread new Thread(new ThreadStart(AddNumber));oneThread.Start();int firstValue0;Thread.Sleep(10); for (int i 0; i 10; i){//入队 firstValue2;Console.WriteLine(队列入队元素 firstValue);CustomQueue.Enqueue(firstValue);}oneThread.Abort(); //终止线程Console.WriteLine(当前队列中的元素 出队);int entity 0;int count CustomQueue.Count;for (int i 0; i count; i){var source CustomQueue.TryDequeue(out entity);if (source!null){Console.WriteLine(队列出队元素entity);}}Console.ReadKey();}static void AddNumber() {value5;Console.WriteLine(队列入队元素 value);CustomQueue.Enqueue(value);}}以后在项目中有关于排队进行的业务有并发考虑和需求的可以使用ConcurrentQueue来实现比如接口日志异步处理、邮件、短信异步等。小寄语人生短暂我不想去追求自己看不见的我只想抓住我能看得见的。原创不易给个关注。我是阿辉感谢您的阅读如果对你有帮助麻烦点赞、转发 谢谢。往期推荐C#多线程开发-使用并发集合C#多线程开发-线程间通讯C#多线程开发-处理子线程中的异常C#多线程开发-了解C#5.0 05C#多线程开发-任务并行库04C#多线程开发-线程池03C#多线程开发-线程同步02C#多线程开发-线程基础 01