首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

走进C#并发队列ConcurrentQueue的内部世界

前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列ConcurrentQueue作为开篇来聊一聊它的实现原理。 话不多说,直奔主题。...事实上,在C#的普通队列Queue类型中选择使用数组进行实现,它实现了一套扩容机制,这里不再详细描述,有兴趣的直接看源码,比较简单。...而队列中维护了2个特殊的指针,他们分别指向队列的首段(head segment)和尾段(tail segment),他们对入队和出队有着重要的作用。用一张图来解释队列的内部结构: ?...到这里,一个并发队列就创建好了。 使用集合创建队列的过程和上面类似,只是多了两个步骤:入队和扩容,下面会重点描述这两部分所以这里不再过多介绍。...而在并发队列中就非常简单了,首先创建一个新Segment,然后把当前Segment的next指向它,最后挂到队列的末尾去就可以了,全部是指针操作非常高效。

2.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    并发队列简介

    并发包下面的并发容器中,ConcurrentLinkedQueue 这种 Concurrent 类型和的集合才真正代表并发。 ?...java.util.concurrent 包并发容器分类 Concurrent CopyOnWrite Blocking Concurrent 类型集合 Concurrent 类型没有类似 CopyOnWrite...在常规队列操作基础上, Blocking意味着提供了特定的等待性操作。 阻塞队列 LinkedBlockingQueue 适用阻塞队列的好处,多线程操作共同的队列时不需要额外的同步。...void put(E e): 在队尾插入元素,方法在队列满的时候会阻塞直到有队列成员被消费 boolean offer(E e): 在队尾插入元素,方法在队列满的时候不会阻塞,直接返回 false E...take(): 取出并删除队列中的首元素,如果队列为空,会阻塞,直到有队列成员被放进来 E poll(): 取出并删除队列中的首元素,如果队列为空,则返回 null,不进行阻塞 E peek(): 取出第一个元素但是不删除它

    45810

    走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇

    在上一篇《走进C#并发队列ConcurrentQueue的内部世界》中解析了Framework下的ConcurrentQueue实现原理,经过抛砖引玉,得到了一众大佬的指点,找到了.NET Core版本下的...在Framework中,队列会给每个Segment分配一个索引,虽然这个索引是long类型的,但理论上说队列容量还是存在上限。...创建实例 ConcurrentQueue依然提供了2个构造函数,分别可以创建一个空队列和指定数据集的队列。...接下来重点说一下队列的IsEmpty。...总结 对比Framework下的并发队列,Core里面的改动还是不小的,尽管保留了SpinWait和Interlocked相关操作,但是也加入了lock,逻辑上也复杂了很多,我一步步分析和写文章搞了好几天

    1.4K40

    java并发队列之阻塞队列-ArrayBlockingQueue

    正文 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列有哪些?...*/ int count; /* * 并发控制使用经典的两条件算法 *发现在任何教科书。...put(e)队列未满时,直接插入没有返回值;队列满时会阻塞等待,一直等到队列未满时再插入。...InterruptedException { abq.put(i); System.out.println("存入了一个元素是 " + i); } } 下面看输出,很明显多线程也没有发生并发问题

    93120

    并发容器和队列

    2.9.3 Java中的队列 队列是一种数据结构,他有先进先出的性质,这点他和栈的性质正好相反。一般使用都是在队列尾部加入元素和从队列头部移除元素,我们经常把他使用在并发环境下。...LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列,队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。...运行结果如下,可以看出多线程并发也没有发生线程安全问题,而且体现出队列是先入先出。...put/take方法可以实现在队列已满或空的时候达到线程阻塞状态,阻塞这种方式在线程并发时固然安全,但是也会造成效率上的问题,所以说今天我们来讲一个非阻塞队列——ConcurrentLinkedQueue...,他能保证并发安全,而且还可以提高效率。

    36520

    C# 的队列

    在C#编程中,队列(Queue)是一种非常重要的数据结构,用于在集合中存储数据,支持先进先出(FIFO)的原则。这意味着元素按照它们被添加的顺序进行访问和移除。...本文将深入探讨C#中的队列,包括它们的基本概念、实现方式、高级用法和最佳实践。1....队列的基本概念1.1 什么是队列队列是一种特殊的集合类,在队列中,元素按照它们被添加的顺序进行移除,即最先添加到队列的元素将是最先被移除的。1.2 队列的特点先进先出:元素的读取顺序与添加顺序相同。...用索引:通常,队列的前端(添加元素的一端)被认为是索引0,队列的后端(移除元素的一端)是队列的最大索引。动态大小:可以根据需要动态地增长。2....实现队列2.1 创建队列Queue numberQueue = new Queue();2.2 向队列添加元素numberQueue.Enqueue(1); // 在队列尾部添加元素

    2.3K00

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    转载自https://blog.csdn.net/westos_linux/article/details/78968012 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列...Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列...并行和并发区别 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑; 2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B...,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...take和put方法,这两个方法正是队列操作的阻塞版本。

    86420

    并发队列-无界阻塞队列LinkedBlockingQueue原理探究

    InterruptedException retry) { timedOut = false; } } } 十二、总结 12.1 并发安全总结...仔细思考下阻塞队列是如何实现并发安全的维护队列链表的,先分析下简单的情况就是当队列里面有多个元素时候,由于同时只有一个线程(通过独占锁putLock实现)入队元素并且是操作last节点(,而同时只有一个出队线程...(通过独占锁takeLock实现)操作head节点,所以不存在并发安全问题。...image.png 考虑当队列为空的时候队列状态为: ?...而ConcurrentLinkedQueue则使用CAS非阻塞算法来实现,使用CAS原子操作保证链表构建的安全性,当多个线程并发时候CAS失败的线程不会被阻塞,而是使用cpu资源去轮询CAS直到成功,size

    83330

    并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究

    如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,count统计队列元素个数,从定义可知道并没有使用volatile...另外构造函数必须传入队列大小参数,所以为有界队列,默认是Lock为非公平锁。...四、put操作 在队列尾部添加元素,如果队列满则等待队列有空位置插入后返回 publicvoidput(E e) throwsInterruptedException { checkNotNull...然后看了其他并发类里面凡是调用了await的方法获取锁时候都是使用的lockInterruptibly方法而不是Lock也验证了这个想法。...操作 从队头获取元素,如果队列为空则阻塞直到队列有元素。

    58340

    Java并发编程:阻塞队列

    Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景   若有不正之处请多多谅解,并欢迎批评指正。   ...二.阻塞队列中的方法 VS 非阻塞队列中的方法 1.非阻塞队列中的几个主要方法:   add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;...2.阻塞队列中的几个主要方法:   阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

    1K40

    C#堆栈和队列

    C#堆栈和队列 此前已经采用 Array类和ArrayList类来把数据像列表一样组织在一起....而队列则用在区分优先次序的操作系统处理以及模拟现实世界的事件方面, 比如银行出纳柜台的队列, 以及建筑物内电梯的操作。 C#为使用这些数据结构提供了两种类:Stack 类和Queue类....如果只是希望察看栈顶的数据项而不是真的要移除它, 那么在C#中有一种名为Peek(取数)的操作可以实现. 此操作在其他语言和实现中可能采用其他的名称(比如Top)....因为C#拥有如此强大的面向对象的编程特征, 所以这里将把我们自定义的堆栈以类的形式来实现. 将这个类命名为CStack, 它应该包括一个构造方法以及上述提及的各种操作方法....我们将使用"属性property"的方式来获取堆栈数据的数量, 从而演示一下C#中类的属性是如何实现的. 首先从该类需要的私有数据开始吧。

    1.2K30

    并发编程之阻塞队列

    并发编程之阻塞队列 1....什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附加操作:...当队列中为空时,从队列中获取元素的操作将被阻塞;当队列满时,向队列中添加元素的操作将被阻塞。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器。 阻塞队列提供了四种操作方法: ?...LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。

    38640

    Java并发队列与容器

    【前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一。...本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark、Storm等源码的,会发现它们底层大多用到了Java并发队列、同步类容器、ReentrantLock等。...建议大家结合本篇文章,仔细分析一下相关源码】 BlockingQueue 阻塞队列,位于java.util.concurrent并发包下,它很好的解决了多线程中如何安全、高效的数据传输问题。...put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...因此不同的segment之间可以并发使用,极大地提高了性能。

    48330

    Java并发队列原理剖析

    allocationSpinLock是个自旋锁,通过CAS操作来保证同时只有一个线程可以扩容队列,状态为0或1。 由于这是一个优先队列,所以有一个comparator用来比较元素大小。.../ 由前面的代码可知,调用tryGrow函数前先获取了独占锁, // 由于扩容比较费时,此处先释放锁, // 让其他线程可以继续操作(如果满足可操作的条件的话), // 以提升并发性能...notEmpty.await(); } finally { lock.unlock(); } return result; } DelayQueue DelayQueue并发队列是一个无界阻塞延迟队列...,队列中的每一个元素都有一个过期时间,当从队列中获取元素时只有过期元素才会出列。...E take() 获取并移除队列里面过期的元素,如果队列里面没有过期元素则等待。

    26030
    领券