ArrayBlockingQueue跟LinkedBlockingQueue的区别

.队列中的锁的实现不同

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

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

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

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

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

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

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

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

注意:

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

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

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

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

ArrayBlockingQueue跟LinkedBlockingQueue的区别的相关文章

ArrayBlockingQueue和LinkedBlockingQueue分析

一.BlockingQueue接口       BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞. 二.ArrayBlockingQueue      ArrayBlockingQueue是一个由数组支持的有界阻塞队列.在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式. 三.LinkedBlock

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

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了Java中BlockingQueue的源码 一.BlockingQueue介绍与常用方法 BlockingQueue是一个阻塞队列.在高并发场景是用得非常多的,在线程池中.如果运行线程数目大于核心线程数目时,也会尝试把新加入的线程放到一个BlockingQueue中去.队列的特性就是先进先出很容易理解,在java里头它的实现类主要有下图的几种,其中最常用到的是ArrayBl

BlockQueue中ArrayBlockingQueue和LinkedBlockingQueue比较

LinkedBlockingQueue是BlockingQueue的一种使用Link List的实现,它对头和尾(取和添加操作)采用两把不同的锁,相对于ArrayBlockingQueue提高了吞吐量.它也是一种阻塞型的容器,适合于实现"消费者生产者"模式. ArrayBlockingQueue是对BlockingQueue的一个数组实现,它使用一把全局的锁并行对queue的读写操作,同时使用两个Condition阻塞容量为空时的取操作和容量满时的写操作. 正因为LinkedBlock

JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlockingQueue,以便日后灵活使用. 1. 在Java的Concurrent包中,添加了阻塞队列BlockingQueue,用于多线程编程.BlockingQueue的核心方法有: boolean add(E e) ,把 e 添加到BlockingQueue里.如果BlockingQueue可以容纳,则返回true,否则抛出异常. boolean offer(E e),表示如果可能的话,将 e 加到B

Java阻塞队列实现原理分析-ArrayBlockingQueue和LinkedBlockingQueue

Java中的阻塞队列接口BlockingQueue继承自Queue接口. BlockingQueue接口提供了3个添加元素方法. add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常 offer:添加元素到队列里,添加成功返回true,添加失败返回false put:添加元素到队列里,如果容量满了会阻塞直到容量不满 3个删除方法. poll:删除队列头部元素,如果队列为空,返回null.否则返回元素. remove:基于对象找到

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

1. ArrayBlockingQueue简介 在多线程编程过程中,为了业务解耦和架构设计,经常会使用并发容器用于存储多线程间的共享数据,这样不仅可以保证线程安全,还可以简化各个线程操作.例如在"生产者-消费者"问题中,会使用阻塞队列(BlockingQueue)作为数据容器,关于BlockingQueue可以看这篇文章.为了加深对阻塞队列的理解,唯一的方式是对其实验原理进行理解,这篇文章就主要来看看ArrayBlockingQueue和LinkedBlockingQueue的实现原理

ArrayBlockingQueue和LinkedBlockingQueue

1. ArrayBlockingQueue 数组存储,固定大小的队列. 一个items数组,一个putIndex指针,从0到len代表已经入队了多少个元素.一个takeIndex指针,从0到len代表出队的元素位置.一个count,记录当前队列里有多少元素. putIndex指针入队的时候不断++,takeIndex出队的时候不断++.这个队列不是一个循环队列,判断队列空和满用count和items.length比较. 入队: 内部的lock锁定,如果队列满,sleep等待,当可以插入的时候,i

ArrayBlockingQueue,BlockingQueue分析

BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞. ArrayBlockingQueue是一个由数组支持的有界阻塞队列.在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式. 基于链表的阻塞队列,同ArrayBlockingQueue类似,其内部也维持着一个数据缓冲队列(该队列由一个链表构成),当生产

【java基础】Java并发包

Java并发包 一.并发包的结构 java并发包中共分为五类: 1.集合框架:包括队列和并发集合 2.同步辅助类 3.线程池 4.Lock锁 5.原子类 二.详解部分 1.同步辅助类详解部分 (1)CountDownLatch 举例:有三个工作,只有三个工作都完成,任务才算执行完成. 1 import java.util.concurrent.CountDownLatch; 2 3 /** 4 * 5 * @author qiuxiang 6 * 7 */ 8 public class Coun