ArrayBlockingQueue和LinkedBlockingQueue
Posted 草莓王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayBlockingQueue和LinkedBlockingQueue相关的知识,希望对你有一定的参考价值。
1、BlockingQueue接口定义了一种阻塞的FIFO queue
ArrayBlockingQueue和LinkedBlockingQueue的区别:
1. 队列中锁的实现不同
ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;
LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock
2. 在生产或消费时操作不同
ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能
3. 队列大小初始化方式不同
ArrayBlockingQueue实现的队列中必须指定队列的大小;
LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE
方法:
offer
将元素插入队列,成功返回true,如果当前没有可用的空间,则返回false
offer(E e, long timeout, TimeUnit unit)
将元素插入队列,在到达指定的等待时间前等待可用的空间
E poll(long timeout, TimeUnit unit)
获取并移除队列的头部,在指定的等待时间前等待可用的元素
void put(E e)
将元素插入队列,将等待可用的空间(堵塞)
take()
获取并移除队列的头部,在元素变得可用之前一直等待(堵塞)
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。
注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。
并行和并发区别
1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率
LinkedBlockingQueue
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
LinkedBlockingQueue对象是 线程阻塞-安全的 ,不接受 null 元素
以上是关于ArrayBlockingQueue和LinkedBlockingQueue的主要内容,如果未能解决你的问题,请参考以下文章
ArrayBlockingQueue和LinkedBlockingQueue
ArrayBlockingQueue和LinkedBlockingQueue
线程池的三种队列区别:SynchronousQueueLinkedBlockingQueue 和ArrayBlockingQueue
线程池的三种队列区别:SynchronousQueueLinkedBlockingQueue 和ArrayBlockingQueue