ArrayBlockingQueue源码分析

62 篇文章 1 订阅
本文详细介绍了ArrayBlockingQueue,一种基于数组的阻塞队列,涉及其初始化、内部结构(ReentrantLock和条件对象)、put和take操作的阻塞与唤醒机制。
摘要由CSDN通过智能技术生成

源码分析

ArrayBlockingQueue是一个数组的阻塞队列 实现了BlockingQueue接口

在new对象的时候,必须设置初始的容量,也就是数组的长度

内部使用ReentrantLock可重入锁

还有2个条件对象,一个是队列不为空的条件对象

一个是队列没满的条件对象

 在添加队列的时候,会先加锁,在代码执行完毕之后释放锁

判断当前的队列的数量是不是满了

如果满了 那么一直在这里阻塞

如果没有满 那么入队

获取数组的信息 

把新的数据放入索引的位置 也就是队尾的位置

然后插入索引++

当索引满了之后 从新 从索引0的位置开始

变成了一个环装

数组元素的数量++

添加完毕之后 唤醒阻塞 让其他数据可以进来

 在出队的时候 使用ReentrantLock加锁 在方法执行完毕后 释放锁

如果当前队列中没有元素 那么一直在这里阻塞

如果队列中有数据 那么出队

获取数组的数据

从队首的索引位置 拿到数据

然后把索引位置的数据 设置为null

然后索引位置++

当索引位置的数据 满了 

那么从新从0开始 构成一个环装

数组的数量--

然后条件对象唤醒阻塞

最后返回当前元素

 

总结 

1.ArrayBlockingQueue数组阻塞队列内部使用了ReentrantLock可重入锁和2个条件队列组成

2.在put的时候,如果队列满了,那么会进行阻塞,把这个线程放入条件队列中

3.在take的时候,如果队列空了,那么会进行阻塞,把这个线程放入条件队列中

4.在put和take添加和移除成功的时候,都会唤醒另一个条件队列的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值