前言
上一篇博文简单介绍了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 ConcurrentQueue CustomQueue = new ConcurrentQueue(); //线程安全的队列
static void Main(string[] args)
{
Console.WriteLine("队列中的元素 入队 两个线程都入队:");
Thread oneThread = new Thread(new ThreadStart(AddNumber));
oneThread.Start();
int firstValue=0;
Thread.Sleep(10);
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?