`
jag522
  • 浏览: 33243 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ArrayBlockingQueue和LinkedBlockingQueue的区别

阅读更多

 

1.队列中的锁的实现不同

       ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁;

       LinkedBlockingQueue中的锁是分离的,即生产用的是putLock,消费是takeLock

 

2.在生产或消费时操作不同

     ArrayBlockingQueue基于数组,在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例;

     LinkedBlockingQueue基于链表,在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会生成一个额外的Node对象,这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。

 

3.队列大小初始化方式不同

     ArrayBlockingQueue是有界的,必须指定队列的大小;

     LinkedBlockingQueue是无界的,可以不指定队列的大小,但是默认是Integer.MAX_VALUE。当然也可以指定队列大小,从而成为有界的。

 

注意: 

  • 在使用LinkedBlockingQueue时,若用默认大小且当生产速度大于消费速度时候,有可能会内存溢出。
  • 在使用ArrayBlockingQueueLinkedBlockingQueue分别对1000000个简单字符做入队操作时,

       LinkedBlockingQueue的消耗是ArrayBlockingQueue消耗的10倍左右,

       LinkedBlockingQueue消耗在1500毫秒左右,而ArrayBlockingQueue只需150毫秒左右。

  • 按照实现原理来分析,ArrayBlockingQueue完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea之所以没这样去做,也许是因为ArrayBlockingQueue的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。

 

0
1
分享到:
评论
2 楼 kidding87 2014-09-15  
dieslrae 写道
数组的生产和消费怎么可以分离,每一次消费都涉及到数组元素的移动

ArrayBlockingQueue take操作并没有元素的移动
采用的是 Circularly increment

ArrayBlockingQueue的速度是优于LinkedBlocingQeque
他们主要的区别是在bound上


1 楼 dieslrae 2014-09-15  
数组的生产和消费怎么可以分离,每一次消费都涉及到数组元素的移动

相关推荐

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    java中LinkedBlockingQueue与ArrayBlockingQueue的异同

    主要介绍了java中LinkedBlockingQueue与ArrayBlockingQueue的异同,需要的朋友可以参考下

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

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

    java并发之ArrayBlockingQueue详细介绍

    主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下

    java-basic:java基础测试-java8

    -&gt; Collection(集合接口)-&gt; List(列表,线性表接口) :ArrayList、LinkedList-&gt; Set(元素不重复的集合接口):HashSet、TreeSet-&gt; Queue(队列): ArrayBlockingQueue、LinkedBlockingQueue-&gt; Deque(双端队列):...

    blockingQueues:简单,高性能,goroutine安全队列,可用作资源池或作业队列

    主要重点是在不牺牲可读性的前提下实现简单性和高性能。 实际上,我试图提供有关代码的良好文档以及一些用法示例。 提供的队列 ArrayBlockingQueue :由切片支持的有界阻塞队列 LinkedBlockingQueue :由容器/列表...

    Java容器.xmind

    container Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class ...ArrayBlockingQueue ...LinkedBlockingQueue ...LinkedBlockingQueue 链表结构实现,无界队列(默认上限Integer.MAX_VALUE)

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...

    JavaInterview:最开源的Java技术知识点,以及Java源码分析。为开源贡献自己的一份力

    ArrayBlockingQueue LinkedBlockingQueue LinkedBlockingDeque :scroll: 主要介绍LeetCode上面的算法译文,以及面试过程中遇到的实际编码问题总结。 :locked: :file_folder: :laptop: :globe_showing_Asia-...

    java并发工具包详解

    3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链...

    java线程池概念.txt

     ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。 threadFactory:线程工厂,主要用来创建线程:默认值 ...

    JAVA高并发_学习笔记

    JAVA学习高并发的学习笔记。...BlockingQueue:ArrayBlockingQueue , DelayQueue , LinkedBlockingDeque , LinkedBlockingQueue , LinkedTransferQueue , PriorityBlockingQueue , SynchronousQueue

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...

    java并发包资源

    3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...

    Java并发包源码分析(JDK1.8)

    其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue(ArrayBlockingQueue、ConcurrentLinkedDeque、DelayQueue、LinkedBlockingQueue等) ...

    第7章-JUC多线程v1.1.pdf

    ArrayBlockingQueue LinkedBlockingQueue SynchronousQueue Handler :拒绝处理策略, 线程数量大于最大线程数量就会拒绝处理策略, 四种策略为 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出...

    architect-awesome:初步架构师技术图谱

    双向队列:ArrayBlockingQueue(有界),LinkedBlockingQueue(无界),DelayQueue,PriorityBlockingQueue,采用锁机制;使用ReentrantLock锁。 集合 链表,纹理 字典,关联数组 栈 Stack是线程安全的。 内部...

    javabitset源码-java_master:后端架构师技术图谱

    阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 集合 链表、数组 字典、关联数组 栈 Stack 是线程安全的。 内部使用...

Global site tag (gtag.js) - Google Analytics