前言 上一篇我们手写了一个阻塞队列,今天我们接着开始学习之旅,让我们一起来看看ArrayBlockingQueue的源码吧。...ArrayBlockingQueue是JDK中提供的工业级的通过数组实现的阻塞队列。...初始ArrayBlockingQueue ArrayBlockingQueue的类图 在这里插入图片描述 如上类图,ArrayBlockingQueue类继承了AbstractQueue抽象类,实现了BlockingQueue...ArrayBlockingQueue中定义的常量 public class ArrayBlockingQueue extends AbstractQueue implements...参考 BlockingQueue-ArrayBlockingQueue 详细源码解析
ArrayBlockingQueue介绍 ArrayBlockingQueue是最典型的有界阻塞队列,其内部是用数组存储元素的,初始化时需要指定容量大小,利用 ReentrantLock 实现线程安全...在生产者-消费者模型中使用时,如果生产速度和消费速度基本匹配的情况下,使用ArrayBlockingQueue是个不错选择;当如果生产速度远远大于消费速度,则会导致队列填满,大量生产线程被阻塞。 ...ArrayBlockingQueue的源码分析 【1】属性值 /** 队列元素数组 */ final Object[] items; /** 下一个被take,poll,peek,remove的元素位置...(int capacity) { this(capacity, false); } public ArrayBlockingQueue(int capacity, boolean fair)...= null) itrs.removedAt(removeIndex); } notFull.signal(); } ArrayBlockingQueue总结
ArrayBlockingQueue底层使用环形数组实现阻塞队列,因此为有界队列,其容量上限在实例化时通过传入的参数capacity决定,本质上就是实例化了一个长度为capacity的数组。...public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable...undefined引用自:https://blog.csdn.net/a1439775520/article/details/98471610 * Itrs 对象简介: ArrayBlockingQueue...所以ArrayBlockingQueue队列需要在特定的场景下,对已经失效、甚至已经被垃圾回收的迭代器管理节点进行清理。...(int capacity):默认非公平可重入锁实现 * ArrayBlockingQueue(int capacity, boolean fair):可通过fair参数选择是否使用公平锁 * ArrayBlockingQueue
摘要: ArrayBlockingQueue 实现原理 ArrayBlockingQueue 应用的场景 ArrayBlockingQueue 和 LinkedBlockingQueue 区别 --...-- TOP 带着问题看源码 ArrayBlockingQueue 实现原理 ArrayBlockingQueue 应用的场景 ArrayBlockingQueue 和 LinkedBlockingQueue...基本介绍 ArrayBlockingQueue 是一个基于数组实现的线程安全的阻塞队列。 其实现了阻塞队列 BlockingQueue 接口和基本队列操作 AbstractQueue 接口 ? 2....构造方法分析 public ArrayBlockingQueue(int capacity) { // 默认非公平锁,调用下个构造方法 this(capacity, false); } /.../ 初始化数组,锁,条件变量 public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0)
ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。...主要源码实现 ArrayBlockingQueue 基于数组,代码相对简单,下面是主要的代码实现。...return dequeue(); } finally { // 释放锁 lock.unlock(); } } 基于 ArrayBlockingQueue...public static void main(String[] args) { final ArrayBlockingQueue container = new ArrayBlockingQueue
序 本文主要简单介绍下ArrayBlockingQueue与LinkedBlockingQueue。...对比 queue 阻塞与否 是否有界 线程安全保障 适用场景 注意事项 ArrayBlockingQueue 阻塞 有界 一把全局锁 生产消费模型,平衡两边处理速度 用于存储队列元素的存储空间是预先分配的...有界无界 ArrayBlockingQueue 有界,适合已知最大存储容量的场景 LinkedBlockingQueue 可有界可以无界 吞吐量 LinkedBlockingQueue在大多数并发的场景下吞吐量比...ArrayBlockingQueue,但是性能不稳定。...这个主要针对LinkedBlockingQueue是无界的场景来说,由于无界,所以offer以及poll的吞吐量通常比ArrayBlockingQueue高。
今天继续分析我们JUC包,ArrayBlockingQueue显然根据名称我们就知道此类是什么,首先它的核心应该是一个数组,然后还是阻塞的,然后连起来就是使用数组做的阻塞队列了。...那么ArrayBlockingQueue阻塞的到底是什么呐?在我看来无非就是让写入的线程排队,让读取的线程进行CAS判断时候预期的元素还存在的问题。那么我们还是看看源码是怎么长得。 ?...如果我们传入的是一个队列,那么ArrayBlockingQueue会先初始化队列和锁,然后对赋值的复制块进行加锁,进行单线程运行。 ?...总结: ArrayBlockingQueue阻塞队列,使用takeIndex表示出队下标,使用putIndex作为入队队列,先进先出。在对队列的写操作的时候都进行加锁处理。...应用: ArrayBlockingQueue的使于那种先进先出的情况,比如生产者和消费者的情况。以及一些顺序要求严格的情况。
提供了三个构造方法: ①.ArrayBlockingQueue(int capacity)//指定长度,默认加锁机制为非公平锁 ②.ArrayBlockingQueue(int capacity..., boolean fair)//显示指定使用公平锁或非公平锁 ③.ArrayBlockingQueue(int capacity, boolean fair,Collection<?
对比一下LinkedBlockingQueue和ArrayBlockingQueue的区别。...的构造函数中,必须显示指定队列大小: public ArrayBlockingQueue(int capacity) { this(capacity, false); }...public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0)...; notEmpty = lock.newCondition(); notFull = lock.newCondition(); } public ArrayBlockingQueue...(int capacity) { this(capacity, false);//默认是非公平锁 } public ArrayBlockingQueue(int capacity
w=1922&h=328&f=png&s=56379] ArrayBlockingQueue is a State-Dependent class,该类只有一些先决条件才能执行操作....3.2 有参 创建具有给定(固定)容量和默认访问策略(非公平)的ArrayBlockingQueue [171a6e64608b4245?...w=2372&h=414&f=png&s=110699] 创建具有给定(固定)容量和指定访问策略的ArrayBlockingQueue [171a6e6418d91a35?...w=3052&h=1086&f=png&s=293400] 创建一个具有给定(固定)容量,指定访问策略并最初包含给定集合的元素的ArrayBlockingQueue,该元素以集合的迭代器的遍历顺序添加...w=2720&h=2604&f=png&s=420673] fair 参数 指定读写锁是否公平 公平锁,锁竞争按先来先到顺序 非公平锁,锁竞争随机 3 新增数据 ArrayBlockingQueue有不同的几个数据添加方法
概述 前文「JDK源码分析-BlockingQueue」简要分析了 BlockingQueue 接口的主要方法,ArrayBlockingQueue 就是该接口的一个主要实现类,本文分析该类的常用方法实现...ArrayBlockingQueue 的类继承结构如下: ? 从 ArrayBlockingQueue 的名字大概可以猜出来,它的内部是由数组实现的,下面分析其代码实现。...代码分析 构造器 构造器 1: // 构造器 1:初始化 ArrayBlockingQueue 对象,使用给定的容量 public ArrayBlockingQueue(int capacity) {...public ArrayBlockingQueue(int capacity, boolean fair, CollectionArrayBlockingQueue 是基于数组的阻塞队列实现,它在初始化时需要指定容量; 2. 内部使用了 ReentrantLock 保证线程安全; 3.
1 ArrayBlockingQueue ArrayBlockingQueue是一个阻塞队列,底层使用数组结构实现,按照先进先出(FIFO)的原则对元素进行排序。...ArrayBlockingQueue是一个线程安全的集合,通过ReentrantLock锁来实现,在并发情况下可以保证数据的一致性。...此外,ArrayBlockingQueue的容量是有限的,数组的大小在初始化时就固定了,不会随着队列元素的增加而出现扩容的情况,也就是说ArrayBlockingQueue是一个“有界缓存区”。...接下来,我们来看看ArrayBlockingQueue的源码实现! 构造方法 在多线程中,默认不保证线程公平的访问队列。 什么叫做公平访问队列?...在ArrayBlockingQueue中,由于公平锁会降低队列的性能,因而使用非公平锁(默认)。
内容摘要ArrayBlockingQueue类是一个高效、线程安全的队列实现,它基于数组,提供了快速的元素访问,并支持多线程间的同步操作,作为有界队列,它能有效防止内存溢出,并通过阻塞机制平衡生产者和消费者的速度差异...主要功能ArrayBlockingQueue主要用于解决以下功能问题:**多线程间的数据共享**: 在多线程编程中,线程之间经常需要共享数据ArrayBlockingQueue作为一个线程安全的队列...**生产者-消费者协作**: ArrayBlockingQueue是实现生产者-消费者模式的理想选择,在生产者-消费者模式中,生产者产生数据放入缓冲区,而消费者从缓冲区中取走数据,ArrayBlockingQueue...类中一些主要方法的含义:**1、核心构造方法**ArrayBlockingQueue(int capacity): 创建一个具有给定容量的新的ArrayBlockingQueue实例。...ArrayBlockingQueue(int capacity, boolean fair): 创建一个具有给定容量和公平性设置的新ArrayBlockingQueue实例,如果设置为公平,等待时间最长的线程将获得访问队列的优先权
其实分析这篇文章的时候自己在想,java这门高级语言真的很好,它的特性也给了自己很多的思考,ArrayBlockingQueue源码分析完之后,我应该不在去分析java的源码了,已经写好的内容,自己会输出和分享出来...这次要分析的ArrayBlockingQueue源码或许是我对之前写的线程池的理解有所帮助一点,主要是为了回顾一下队列的使用,之前好像在分析队列的源码时自己好像说过队列在工作中没有用到过,好像线程池里面用到了队列...接下来就是分析ArrayBlockingQueue的源码了,首先自己一般都是从构造函数进行看的,每个人都有自己的一套方法去看的。...public ArrayBlockingQueue(int capacity, boolean fair) { //判断capacity是否小于等于0,若小于等于0则直接抛出异常 if (...整个ArrayBlockingQueue的源码分析到这里就结束了,自己或许后面会分享一下关于其它的内容,不再是源码的分析分享了,可能会画点图之类的吧,毕竟这也是自己在这方面需要增进的一点的,"写代码的干不过画
概述 ArrayBlockingQueue 是 BlockingQueue 接口的有界队列实现类,底层采用数组来实现。ArrayBlockingQueue 一旦创建,容量不能改变。...而非公平性则是指访问 ArrayBlockingQueue 的顺序不是遵守严格的时间顺序,有可能存在,当 ArrayBlockingQueue 可以被访问时,长时间阻塞的线程依然无法访问到 ArrayBlockingQueue...ArrayBlockingQueue内部结构 1.ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。...ArrayBlockingQueue的大小,即数组的容量是在创建创建ArrayBlockingQueue时候指定的。...ArrayBlockingQueue添加元素 ? ArrayBlockingQueue获取元素
一、Lock & Condition ArrayBlockingQueue以可重入锁和两个Condition对象来控制并发。.... /** * Creates an ArrayBlockingQueue with the given (fixed) * capacity and the...四、ReentrantLock vs AbstractQueuedSynchronizer ArrayBlockingQueue使用ReentrantLock来控制并发,同时也使用ArrayBlockingQueue...在ArrayBlockingQueue中的notEmpty就是ConditionObject实例。...通知: 当新的元素put进入ArrayBlockingQueue后,notEmpty.signal()通知在这上面等待的线程,如ConditionObject的signal方法, /**
ArrayBlockingQueue简介 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指类内部通过“互斥锁”保护竞争资源,实现多线程对竞争资源的互斥访问。...ArrayBlockingQueue函数列表 // 创建一个带有给定的(固定)容量和默认访问策略的ArrayBlockingQueue。...ArrayBlockingQueue(int capacity) // 创建一个具有给定的(固定)容量和指定访问策略的ArrayBlockingQueue。...ArrayBlockingQueue(int capacity, boolean fair) // 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue,它最初包含给定collection...public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlockingQueue
基于数组阻塞队列 ArrayBlockingQueue 前面学习了基于数组的非阻塞双端队列ArrayDeque,其内部维护一个数组和指向队列头和队列尾索引的两个成员变量;本篇则探究下基于数组的阻塞队列是什么样的数据结构...Prefer 分析阻塞原理之前,先通过注释解释下ArrayBlockingQueue的使用场景 先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素) 有界队列(即初始化时指定的容量,就是队列最大的容量...应用场景及case 创建线程池时,通常会用到 ArrayBlockingQueue或者LinkedBlockingQueue,如 new ThreadPoolExecutor(1, 1,...0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(2)); 延迟队列也是并发安全,ArrayBlockingQueue...相比较 DelayQueue应用场景的区别主要在 有界和无界(ArrayBlockingQueue不会扩容,而DelayQueue会出现扩容) 前者队列非空就可以出队;后者则需要队列头生效(getDelay
一、 前言 上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue 二、 ArrayBlockingQueue...image.png 如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,count统计队列元素个数,从定义可知道并没有使用...public ArrayBlockingQueue(int capacity) { this(capacity, false); } public ArrayBlockingQueue...lock.lock(); try { return count; } finally { lock.unlock(); } } 九总结 ArrayBlockingQueue...另外相比LinkedBlockingQueue,ArrayBlockingQueue的size操作的结果是精确的,因为计算前加了全局锁。
一、 前言 本章来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue 二、 ArrayBlockingQueue类图结构 ?...如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,count统计队列元素个数,从定义可知道并没有使用volatile...; lock.lock(); try{ returncount; } finally{ lock.unlock(); } } 九、总结 ArrayBlockingQueue...另外相比LinkedBlockingQueue,ArrayBlockingQueue的size操作的结果是精确的,因为计算前加了全局锁。 喜欢的点点关注点点赞。
领取专属 10元无门槛券
手把手带您无忧上云