展开

关键词

JavaConcurrentLinkedQueue

下面就来学习一下本文的主角ConcurrentLinkedQueue: 1)ConcurrentLinkedQueue的结构 2)offer方法原理 3)poll方法原理 4)HOPS设计 ConcurrentLinkedQueue 头节点 private transient volatile Node<E> head; //尾节点 private transient volatile Node<E> tail; public ConcurrentLinkedQueue 参考文章 http://ifeve.com/concurrentlinkedqueue/ https://juejin.im/post/5aeeae756fb9a07ab11112af

42620

Java并发容器--ConcurrentLinkedQueue

例如:ConcurrentLinkedQueue   下面从源代码中分析ConcurrentLinkedQueue的实现方法。 类关系图 ?      《Java内存模型中》提到volatile变量可以实现可见性,其原理就是插入内存屏障以保证不会重排序指令,使用的是store-load内存屏障,开销较大。 看反汇编后的字节码指令: 1 public class Test { 2 public static void main(java.lang.String[] args 看反汇编后的字节码指令: 1 public class Test { 2 public static void main(java.lang.String[] args 参考资料:   《Java并发编程的艺术》   ConcurrentLinkedQueue源码分析(http://www.jianshu.com/p/7816c1361439)

44830
  • 广告
    关闭

    腾讯云服务器买赠活动

    腾讯云服务器买赠活动,低至72元1年,买就送,最长续3个月,买2核送4核、买4核送8核

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

    Java并发-21.ConcurrentLinkedQueue

    ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列。 采用FIFO对节点排序 采用CAS实现非阻塞 1. ConcurrentLinkedQueue结构 由head和tail节点组成 每个节点(Node)由节点元素(item)和指向下一个节点的指针(next)组成 2.

    21630

    Java集合--非阻塞队列(ConcurrentLinkedQueue实现原理)

    ConcurrentLinkedQueue实现原理 上文,笔者介绍了非阻塞队列的基础知识,对于其代表类ConcurrentLinkedQueue做了个简单阐述。 本篇,我们就继续对ConcurrentLinkedQueue进行学习,来看看ConcurrentLinkedQueue的底层实现! 之前,我们说了ConcurrentLinkedQueue是使用CAS来实现非阻塞入队出队。在Node结点中,我们也使用了CAS来实现结点的操作。 (image-5157b1-1514418648920)] 通过上面5张图片,希望你能对ConcurrentLinkedQueue的出队流程有一个清晰的思路。 以上便是ConcurrentLinkedQueue的全部内容!

    1K70

    Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析

    文章目录 概述 ConcurrentLinkedQueue 核心方法&源码解读 offer add poll peek size remove contains 总结 概述 JDK中提供了一系列场景的并发安全队列 总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列, 阻塞队列使用锁实现 非阻塞队列则使用CAS非阻塞算法实现 ConcurrentLinkedQueue ConcurrentLinkedQueue 【类图】 ConcurrentLinkedQueue内部的队列使用单向链表方式实现, 其中有两个volatile类型的Node节点分别用来存放队列的首、尾节点。 核心方法&源码解读 下面我们介绍ConcurrentLinkedQueue的几个主要方法的实现原理。 = null && o.equals(item)) return true; } return false; } 总结 ConcurrentLinkedQueue

    11020

    【原创】Java并发编程系列29 | ConcurrentLinkedQueue

    的并发安全集合 ConcurrentHashMap,List 并发安全集合 CopyOnWriteArrayList,Set 并发安全集合 CopyOnWriteArraySet,本篇文章就来介绍并发安全的队列 ConcurrentLinkedQueue ConcurrentLinkedQueue 是一个基于链接节点的无边界的线程安全队列,采用非阻塞算法实现线程安全。 类结构 队列由单向链表实现,ConcurrentLinkedQueue 持有头尾指针(head/tail 属性)来管理队列。 ? public class ConcurrentLinkedQueue<E> { private transient volatile Node<E> head; private transient

    23320

    ConcurrentLinkedQueue 源码解读

    一、介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素 ConcurrentLinkedQueue 采用非阻塞的方式实现线程安全队列,它采用了"wait-free"算法(即CAS算法)来实现。 ? ConcurrentLinkedQueue 由 head 节点和 tail 节点组成,每个节点(Node)由节点元素(item)和指向下一个节点(next)的引用组成,节点与节点之间就是通过这个 next 想要读懂 ConcurrentLinkedQueue 的源码,最好先搞懂以下特质: 队列中任意时刻只有最后一个元素的 next 为 null head 和 tail 不会是 null(哨兵节点的设计)

    45320

    Java集合--非阻塞队列(ConcurrentLinkedQueue基础)

    在非阻塞队列中,ConcurrentLinkedQueue是主要代表。 之前,我们了解了什么是阻塞队列,在此我们再简单地回顾下! 什么是阻塞队列? ConcurrentLinkedQueue ConcurrentLinkedQueue是一个线程安全的队列,基于链表结构实现,是一个无界队列,理论上来说队列的长度可以无限扩大。 与其他队列相同,ConcurrentLinkedQueue也采用的是先进先出(FIFO)入队规则,对元素进行排序。 详细描述,可参考如下内容:神奇的控制台 解决方案:将ConcurrentLinkedQueue源码拷出,本地新建一个类,使用run执行,在方法的前后增加自己的输出语句,打印出实际的内存地址,便可一探究竟 如果你不想对源码进行修改,只想用debug模式,建议将拷贝源码中的ConcurrentLinkedQueue的继承和实现统统去掉,形式如下:public class ConcurrentLinkedQueue

    1.1K60

    死磕 java集合之ConcurrentLinkedQueue源码分析

    ---- 问题 (1)ConcurrentLinkedQueue是阻塞队列吗? (2)ConcurrentLinkedQueue如何保证并发安全? (3)ConcurrentLinkedQueue能用于线程池吗? 简介 ? ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。 主要构造方法 public ConcurrentLinkedQueue() { // 初始化头尾节点 head = tail = new Node<E>(null);} public ConcurrentLinkedQueue 不是阻塞队列; (2)ConcurrentLinkedQueue不能用在线程池中; (3)ConcurrentLinkedQueue使用(CAS+自旋)更新头尾节点控制出队入队操作; 彩蛋 ConcurrentLinkedQueue

    16920

    Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析

    文章目录 概述 ConcurrentLinkedQueue 概述 JDK中提供了一系列场景的并发安全队列。 总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列, 阻塞队列使用锁实现 而非阻塞队列则使用CAS非阻塞算法实现 ConcurrentLinkedQueue ConcurrentLinkedQueue

    8820

    ConcurrentLinkedQueue vs BlockingQueue比较

    纯demo代码 package com.honey; import java.util.Arrays; import java.util.List; import java.util.concurrent private static void lockFreeVersion(boolean print) { List<Integer> array = g(); ConcurrentLinkedQueue linkedQueue = new ConcurrentLinkedQueue(Arrays.asList(array)); long startMills = System.currentTimeMillis } } } static class LockFreeConsumer implements Runnable { final ConcurrentLinkedQueue linkedQueue; final CountDownLatch countDownLatch; LockFreeConsumer(ConcurrentLinkedQueue

    26310

    ConcurrentLinkedQueue使用实例

    ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素 ArrayBlockingQueue 阻塞 有界 一把全局锁 生产消费模型,平衡两边处理速度 — LinkedBlockingQueue 阻塞 可配置 存取采用2把锁 生产消费模型,平衡两边处理速度 无界的时候注意内存溢出问题 ConcurrentLinkedQueue 非阻塞 无界 CAS 对全局的集合进行操作的场景 size() 是要遍历一遍集合,慎用 实例 由于ConcurrentLinkedQueue是无界的,所以使用的时候要特别注意内存溢出问题。 object UnboundedMailbox { class MessageQueue extends ConcurrentLinkedQueue[Envelope] with UnboundedQueueBasedMessageQueue Option<ActorSystem> system) { return new MyMessageQueue(); } } doc Actors and Green Threads in Java

    95730

    Java 并发包中并发原理剖析之ConcurrentLinkedQueue

    [Java] Java 并发包中并发原理剖析之ConcurrentLinkedQueue ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单向链表实现,对于入队和出队操作使用 /** * Creates a {@code ConcurrentLinkedQueue} that is initially empty. */ public ConcurrentLinkedQueue 内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedQueue 之前的线程中的操作 happen-before 随后通过另一线程从 ConcurrentLinkedQueue 此类是 Java Collections Framework 的成员。 方法摘要 add(E e) 将指定元素插入此队列的尾部。 REFERENCES Java并发编程之美 JDK-API-DOCS

    28120

    ConcurrentLinkedQueue 源码分析

    摘要: ConcurrentLinkedQueue 是怎么保证线程安全的 ConcurrentLinkedQueue 和 LinkedBlockingQueue 区别是啥 ConcurrentLinkedQueue 的应用场景 ---- TOP 带着问题看源码 ConcurrentLinkedQueue 是怎么保证线程安全的 ConcurrentLinkedQueue 和 LinkedBlockingQueue 区别是啥 ConcurrentLinkedQueue 的应用场景 1. 基本介绍 ConcurrentLinkedQueue 是一个线程安全且 非阻塞 的 无界 队列,它采用先进先出的规则,实现了 AbstractQueue 基础抽象类和 Queue 接口。 总结 对比阻塞队列,ConcurrentLinkedQueue 没有条件变量、锁等那些复杂的东西,代码设计层面尽量是简洁、巧妙。

    33610

    ConcurrentLinkedQueue和LinkedBlockingQueue用法

    作者: Ruthless 关注 - 28 粉丝 - 2969 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。 Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列 ConcurrentLinkedQueue ConcurrentLinkedQueue是Queue的一个安全实现.Queue中元素按FIFO原则进行排序.采用CAS操作,来保证元素的一致性。 LinkedBlockingQueue是一个线程安全的阻塞队列,它实现了BlockingQueue接口,BlockingQueue接口继承自java.util.Queue接口,并在这个接口的基础上增加了 当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。

    2K50

    【死磕 Java 并发】—– J.U.C 之 Java 并发容器:ConcurrentLinkedQueue

    SkipListSkipList的特性SkipList的查找SkipList的插入SkipList的删除ConcurrentSkipListMapput操作get操作remove操作size操作 ---- 到目前为止,我们在Java 下面,我们开始征服Java并发的阻塞队列

    16720

    【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentLinkedQueue

    ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算法(即CAS算法)来实现的。 对于这种情况ConcurrentLinkedQueue怎么处理呢? 初始化 ConcurrentLinkedQueue初始化时head、tail存储的元素都为null,且head等于tail: ? 这个疑问我们在出列poll()中分析 出列 ConcurrentLinkedQueue提供了poll()方法进行出列操作。入列主要是涉及到tail,出列则涉及到head。 到这里ConcurrentLinkedQueue的整个入列、出列都已经分析完毕了,对于ConcurrentLinkedQueue LZ真心感觉难看懂,看懂之后也感叹设计得太精妙了,利用CAS来完成数据操作

    47450

    并发编程之ConcurrentLinkedQueue原理

    概述 Java 提供的线程安全的 Queue 可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是 BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列 从名字可以看出,ConcurrentLinkedQueue这个队列使用链表作为其数据结构.ConcurrentLinkedQueue 应该算是在高并发环境中性能最好的队列了。 ConcurrentLinkedQueue 适合在对性能要求相对较高,同时对队列的读写存在多个线程同时进行的场景,即如果对队列加锁的成本较高则适合使用无锁的 ConcurrentLinkedQueue ConcurrentLinkedQueue类图 执行原理 ? 入队示意图 假设往ConcurrentLinkedQueue中添加A,B, C三个元素。 初始化 ? 初始化 添加元素A ?

    52110

    Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下ConcurrentLinkedQueue 1.ConcurrentLinkedQueue的结构 ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部 ConcurrentLinkedQueue 的非阻塞算法实现主要可概括为下面几点: 使用 CAS 原子指令来处理对数据的并发访问,这是非阻塞算法得以实现的基础。 ConcurrentLinkedQueue由head节点和tail节点组成,每个节点(Node)由节点元素(item)和指向下一个节点的引用(next)组成,节点与节点之间就是通过这个next关联起来, 参考资料 《Java并发编程的艺术》 JDK1.8源码

    522100

    JDK容器学习之Queue:ConcurrentLinkedQueue

    并发安全的链表队列 ConcurrentLinkedQueue 并发安全的链表队列,主要适用于多线程环境中;底层数据结构为链表,由于队列本身频繁的出队和进队,那么这个线程安全是如何保障 I. 队列个数获取 单独拿出size方法,因为与常见的容器不同,ConcurrentLinkedQueue的size()方法是非并发安全,且每次都会进行扫描整个链表,结果如下 public int size( 且时间复杂度为 O(n) 判断队列是否为空,请用 isEmpty() 进行替代 因为未加锁,出队入队的性能相对较好,切代码的实现比较优雅;然实际的业务场景中,非大神级人物尽量不要这么玩,维护成本太高 参考 Java 线程 — ConcurrentLinkedQueue

    35660

    相关产品

    • 腾讯 Kona

      腾讯 Kona

      腾讯 Kona(TK)是免费、可立即投入生产的 OpenJDK 发行版。腾讯 Kona 基于 TencentJDK 开发,针对云应用场景定制新的功能及优化, 具备更快的云应用启动速度,更好的性能以及更为便捷的分析、诊断工具……

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券