LinkedBlockingQueue和ArrayBlockingQueue的异同

转载 2018年04月17日 14:12:12

相同:

1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;

2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列

  内部都是使用ReentrantLock和Condition来保证生产和消费的同步;

  当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;

使用Condition的方法来同步和通信:await()和signal()

不同:

1、由上图可以看出,他们的锁机制不同

  LinkedBlockingQueue中的锁是分离的,生产者的锁PutLock,消费者的锁takeLock

  而ArrayBlockingQueue生产者和消费者使用的是同一把锁;

2、他们的底层实现机制也不同

  LinkedBlockingQueue内部维护的是一个链表结构

在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大

  而ArrayBlockingQueue内部维护了一个数组

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

 3、构造时候的区别

  LinkedBlockingQueue有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小

  ArrayBlockingQueue在初始化的时候,必须传入一个容量大小的值

  看其提供的构造方法就能知道

4、执行clear()方法

  LinkedBlockingQueue执行clear方法时,会加上两把锁

 5、统计元素的个数

  LinkedBlockingQueue中使用了一个AtomicInteger对象来统计元素的个数

  ArrayBlockingQueue则使用int类型来统计元素

源码解析:ArrayBlockingQueue和LinkedBlockingQueue的区别

对于ArrayBlockingQueue和LinkedBlockingQueue已经都只是知道如何使用以及他们各自的特点,没有去看看源码到底驶入实现的!因为ArrayBlockingQueue和Lin...
  • Green_shing
  • Green_shing
  • 2015-06-29 17:11:29
  • 1526

ArrayBlockingQueue和LinkedBlockingQueue的区别及使用

BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会...
  • USTC_Zn
  • USTC_Zn
  • 2017-02-04 16:56:22
  • 4497

ArrayBlockingQueue跟LinkedBlockingQueue的区别

1.队列中的锁的实现不同        ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁;        LinkedBlockingQueue中的锁是分离的,即...
  • z69183787
  • z69183787
  • 2015-07-21 15:32:32
  • 5493

Java LinkedBlockingQueue和ArrayBlockingQueue分析

LinkedBlockingQueue是一个链表实现的阻塞队列,在链表一头加入元素,如果队列满,就会阻塞,另一头取出元素,如果队列为空,就会阻塞。 LinkedBlockingQueue内部使用R...
  • hongchangfirst
  • hongchangfirst
  • 2014-09-29 12:09:13
  • 14553

ConcurrentLinkedQueue、AraayBlockingQueue、LinkedBlockingQueue 区别及使用场景

三者区别与联系:联系,三者 都是线程安全的。区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理;后2者采用锁机制,所以是阻塞的。注意点就是前者由于采用cas算法,虽...
  • fz2543122681
  • fz2543122681
  • 2016-10-03 22:29:02
  • 1634

ArrayBlockingQueue 和 LinkedBlockingQueue 对比

ArrayBlockingQueue 和 LinkedBlockingQueue 对比ArrayBlockingQueue和LinkedBlockingQueue都支持blockingQueue的概念...
  • kang389110772
  • kang389110772
  • 2016-12-19 11:18:09
  • 653

JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlockingQueue,以便日后灵活使用。 1. 在Java的Concurrent包中,添加了阻塞队列Bloc...
  • xin_jmail
  • xin_jmail
  • 2014-05-19 10:51:52
  • 23280

ConcurrentLinkedQueue是非阻塞的,blockingqueue是阻塞的

 java.util.concurrent ConcurrentLinkedQueue 类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent...
  • a936676463
  • a936676463
  • 2014-08-12 19:38:44
  • 1289

Java常用的2种阻塞队列ArrayBlockingQueue和LinkedBlockingQueue

ArrayBlockingQueue       基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长...
  • chichuduxing
  • chichuduxing
  • 2017-04-05 19:11:24
  • 304

Java并发编程与技术内幕:ArrayBlockingQueue、LinkedBlockingQueue及SynchronousQueue源码解析

本文主要讲了Java中BlockingQueue的源码一、BlockingQueue介绍与常用方法BlockingQueue是一个阻塞队列。在高并发场景是用得非常多的,在线程池中。如果运行线程数目大于...
  • Evankaka
  • Evankaka
  • 2016-06-21 09:18:29
  • 5546
收藏助手
不良信息举报
您举报文章:LinkedBlockingQueue和ArrayBlockingQueue的异同
举报原因:
原因补充:

(最多只允许输入30个字)