ArrayBlockingQueue 源码分析 - 构造方法
特点
ArrayBlockingQueue 也叫做数组阻塞队列,底层使用的是数组。
有界的阻塞数组,容量一旦创建,后续大小无法修改
元素是有顺序的,按照先入先出进行排序,从队尾插入数据数据,从队头拿数据
队列满时,往队列中 put 数据会被阻塞,队列空时,往队列中拿数据也会被阻塞
源码属性
final Object[] items;
队列存放在 object 的数组里面,数组大小必须在初始化的时候手动设置,没有默认大小
int takeIndex;
下次拿数据的时候的索引位置
int putIndex;
下次放数据的索引位置
int count;
当前已有元素的大小
final ReentrantLock lock;
可重入的锁
private final Condition notEmpty;
take 的队列
private final Condition notFull;
put 的队列
其中 takeIndex 和 putIndex,分别表示下次拿数据和下次放数据的索引,所以在新增数据和拿取数据时都无需进行多余的计算,可以直接知道应该新增到什么位置、从什么位置拿数据。
构造方法
notEmpty = lock.newCondition();
队列不为空 Condition,在 put 成功时使用
notFull = lock.newCondition();
队列不满 Condition,在 take 成功时使用
其中 fair 参数主要用于设置读写锁是否公平。
有指定初始数据的构造方法:
int i = 0;
表示插入的位置
for (E e : c) { checkNotNull(e); items[i++] = e; }
如果 c 的大小超过了数组的大小会抛出异常
putIndex = (i == capacity) ? 0 : i;
如果插入的位置是队尾,则下次从 0 开始插入
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/df4a5f0539e82407c78dc4611】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论