`

ConcurrentLinkedQueue和LinkedBlockingQueue区别

 
阅读更多

原创转载请注明出处:https://agilestyle.iteye.com/blog/2443538

 

线程安全队列类图

两者的区别在于

  • ConcurrentLinkedQueue基于CAS的无锁技术,不需要在每个操作时使用锁,所以扩展性表现要更加优异,在常见的多线程访问场景,一般可以提供较高吞吐量。
  • LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。

BlockingQueue基本都是基于锁实现,比如典型的LinkedBlockingQueue


 

有界队列和无界队列

  • ArrayBlockingQueue是最典型的的有界队列,其内部以final的数组保存数据,数组的大小就决定了队列的边界,所以我们在创建ArrayBlockingQueue时,都要指定容量,如 
public ArrayBlockingQueue(int capacity, boolean fair)
  • LinkedBlockingQueue,容易被误解为无边界,但其实其行为和内部代码都是基于有界的逻辑实现的,只不过如果我们没有在创建队列时就指定容量,那么其容量限制就自动被设置为Integer.MAX_VALUE,成为了无界队列。
  • SynchronousQueue,这是一个非常奇葩的队列实现,每个删除操作都要等待插入操作,反之每个插入操作也都要等待删除动作。那么这个队列的容量是多少呢?是1吗?其实不是的,其内部容量是0。
  • PriorityBlockingQueue是无边界的优先队列,虽然严格意义上来讲,其大小总归是要受系统资源影响。
  • DelayedQueue和LinkedTransferQueue同样是无边界的队列。对于无边界的队列,有一个自然的结果,就是put操作永远也不会发生其他BlockingQueue的那种等待情况。

 

有界队列使用场景

以LinkedBlockingQueue、ArrayBlockingQueue和SynchronousQueue为例,根据需求可以从很多方面考量:

  • 考虑应用场景中对队列边界的要求。ArrayBlockingQueue是有明确的容量限制的,而LinkedBlockingQueue则取决于我们是否在创建时指定,SynchronousQueue则干脆不能缓存任何元素。
  • 从空间利用角度,数组结构的ArrayBlockingQueue要比LinkedBlockingQueue紧凑,因为其不需要创建所谓节点,但是其初始分配阶段就需要一段连续的空间,所以初始内存需求更大。
  • 通用场景中,LinkedBlockingQueue的吞吐量一般优于ArrayBlockingQueue,因为它实现了更加细粒度的锁操作。
  • ArrayBlockingQueue实现比较简单,性能更好预测,属于表现稳定的“选手”。
  • 如果需要实现的是两个线程之间接力性(handoff)的场景,可能会选择CountDownLatch,但是SynchronousQueue也是完美符合这种场景的,而且线程间协调和数据传输统一起来,代码更加规范。
  • 可能令人意外的是,很多时候SynchronousQueue的性能表现,往往大大超过其他实现,尤其是在队列元素较小的场景。

Reference

https://time.geekbang.org/column/article/9588

 

 

 

  • 大小: 42.4 KB
  • 大小: 82.4 KB
分享到:
评论

相关推荐

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

    ### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...

    LinkedBlockingQueue 和 ConcurrentLinkedQueue的区别.docx

    LinkedBlockingQueue和ConcurrentLinkedQueue是Java并发包中两个常用的线程安全队列,它们各有特点,适用于不同的场景。本文将深入探讨两者之间的差异以及如何根据需求选择合适的队列。 首先,LinkedBlockingQueue...

    java数据的相关算法

    1. 并发队列:Java 的并发库提供了一组线程安全的队列实现,如 ConcurrentLinkedQueue 和 LinkedBlockingQueue,它们在多线程环境中高效且安全。 2. 队列优先级排序:PriorityQueue 是一个可以按照特定顺序排序的...

    sycdtk-cmdline-jmxclient-master_java_

    这可能涉及到Java的并发库,如ExecutorService、ScheduledExecutorService,以及可能的队列数据结构,如Java的ConcurrentLinkedQueue或LinkedBlockingQueue,用于处理异步任务和批量操作。 在压缩包中的"cmdline-...

    Java架构面试专题汇总(含答案)和学习笔记.zip

    - 并发容器:如ConcurrentLinkedQueue、LinkedBlockingQueue等线程安全的数据结构。 3. **多线程** - 线程创建:Thread类和Runnable接口,线程池ExecutorService的使用。 - 线程同步:synchronized关键字,wait...

    【面试资料】-(机构内训资料)Java并发编程面试专题.zip

    - **并发容器**:CopyOnWriteArrayList、ConcurrentLinkedQueue、LinkedBlockingQueue等,适用于高并发读取场景。 5. **并发工具类** - **CountDownLatch**:计数器,用于多线程协同工作,计数到零后所有线程继续...

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic...该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。

    实战Concurrent-BlockQueue

    本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`LinkedBlockingQueue`这三种实现,并分析它们的设计原理与应用场景。 首先,我们来看`ConcurrentLinkedQueue`。它是基于非阻塞算法(CAS,...

    并发容器的原理,7大并发容器详解、及使用场景

    它们分别基于链表、数组和优先级堆实现,其中 ArrayBlockingQueue 和 LinkedBlockingQueue 使用 ReentrantLock 和 Condition 实现线程安全,PriorityBlockingQueue 则是一个按优先级排序的队列。 在选择并发容器时...

    juc-learn:juc相关源码的分析以及使用介绍

    ConcurrentLinkedQueue、LinkedBlockingQueue等队列是线程安全的,适用于生产者消费者模型。它们在高并发场景下表现出色。 9. **ScheduledExecutorService** 该接口提供了定时和周期性任务的执行能力,可以用于...

    JavaDataStructures

    13. **队列实现**:Java的并发库提供了ConcurrentLinkedQueue和LinkedBlockingQueue等线程安全的队列实现,适合多线程环境。 以上只是Java数据结构的一部分,实际开发中还可能涉及到更多高级数据结构,如堆栈、双端...

    Java数据结构实现之Queue.zip

    例如,如果需要高效的并发操作,可以选择`ConcurrentLinkedQueue`或`LinkedBlockingQueue`;如果对元素的顺序有特定要求,可以使用`PriorityQueue`;对于一般用途且对性能要求较高,`ArrayDeque`是不错的选择。 ...

    java队列源码

    - Java 提供了多种队列实现,如 `LinkedList`、`ArrayDeque` 和并发类 `ConcurrentLinkedQueue`、`LinkedBlockingQueue` 等。其中,`ConcurrentLinkedQueue` 是一个非阻塞的线程安全队列,而 `LinkedBlockingQueue`...

    【2018最新最详细】并发多线程教程

    20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...

    heima-JUC-资料

    3. **并发集合**:如`ConcurrentLinkedQueue`、`LinkedBlockingQueue`、`ConcurrentSkipListMap`等,这些集合类在设计时就考虑了并发性能,能够在不使用锁的情况下进行并发修改,从而提高了并发效率。 4. **锁**:`...

    构建高性能服务(一)ConcurrentSkipListMap和链表构建高性能Java Memcached

    另外,为了进一步优化性能,我们还可以考虑使用`LinkedBlockingQueue`或`ConcurrentLinkedQueue`这样的并发队列来管理缓存的入队和出队操作。这些队列在多线程环境下的性能表现优秀,能够有效减少锁竞争,提高并发...

    数据结构面试专题.docx

    - **并发 Queue**:如ConcurrentLinkedQueue和BlockingQueue(如LinkedBlockingQueue),适用于生产者-消费者模型。 - **并发 Deque**:例如LinkedBlockingDeque,线程安全的双端队列。 - **并发锁**:包括...

    高并发多线程处理demo-java.rar

    2. **并发队列**:并发队列如`ConcurrentLinkedQueue`或`LinkedBlockingQueue`,是线程安全的数据结构,用于在多线程环境中存储和传递任务。它们提供了高效的并发操作,例如添加、移除元素,同时保证了数据的一致性...

    Java并发编程进阶练习代码

    `Concurrent`包包含了大量设计精良且线程安全的数据结构,如`ConcurrentHashMap`(线程安全的哈希映射),`ConcurrentLinkedQueue`(无界的并发队列)和`CopyOnWriteArrayList`(写时复制的列表)等。这些数据结构在...

    14个Java并发容器,你用过几个?.docx

    5. **ConcurrentLinkedDeque**: 与ConcurrentLinkedQueue类似,但它是一个双端队列,支持从队首和队尾进行插入和移除操作,既可以作为队列也可以作为栈。 6. **ConcurrentSkipListMap**: 使用跳表(Skip List)实现...

Global site tag (gtag.js) - Google Analytics