源码分析
ArrayBlockingQueue是一个数组的阻塞队列 实现了BlockingQueue接口
在new对象的时候,必须设置初始的容量,也就是数组的长度
内部使用ReentrantLock可重入锁
还有2个条件对象,一个是队列不为空的条件对象
一个是队列没满的条件对象
在添加队列的时候,会先加锁,在代码执行完毕之后释放锁
判断当前的队列的数量是不是满了
如果满了 那么一直在这里阻塞
如果没有满 那么入队
获取数组的信息
把新的数据放入索引的位置 也就是队尾的位置
然后插入索引++
当索引满了之后 从新 从索引0的位置开始
变成了一个环装
数组元素的数量++
添加完毕之后 唤醒阻塞 让其他数据可以进来
在出队的时候 使用ReentrantLock加锁 在方法执行完毕后 释放锁
如果当前队列中没有元素 那么一直在这里阻塞
如果队列中有数据 那么出队
获取数组的数据
从队首的索引位置 拿到数据
然后把索引位置的数据 设置为null
然后索引位置++
当索引位置的数据 满了
那么从新从0开始 构成一个环装
数组的数量--
然后条件对象唤醒阻塞
最后返回当前元素
总结
1.ArrayBlockingQueue数组阻塞队列内部使用了ReentrantLock可重入锁和2个条件队列组成
2.在put的时候,如果队列满了,那么会进行阻塞,把这个线程放入条件队列中
3.在take的时候,如果队列空了,那么会进行阻塞,把这个线程放入条件队列中
4.在put和take添加和移除成功的时候,都会唤醒另一个条件队列的线程