目录
一. 什么是阻塞队列
二. java中的阻塞队列
三. 生产者消费者模型
3.1 生产者消费者模型与阻塞队列密不可分的关系
3.2 阻塞队列在生产者消费者模型的作用
a. 解耦合
b. 削峰填谷
四. 模拟实现阻塞队列
4.1 实现put方法
4.2 实现take方法
4.3 生产者消费者模型
五.总结
一. 什么是阻塞队列
阻塞队列是具有阻塞特性的队列, 它是线程安全的.
阻塞特性:
1. 出队列时, 如果队列为空, 此时就会阻塞, 直到向队列中添加元素为止.
2. 入队列时, 如果队列满了, 此时也会阻塞, 直到从队列中移出元素为止.
二. java中的阻塞队列
java中的阻塞队列是一个接口(BlockingQueue<T>), 常用的实例化类有:
1. ArrayBlockingQueue<>(capacity); // 顺序表
2. LinkedBlockingQueue<>(capacity); // 链表
3. PriorityBlockingQueue<>(capacity); // 优先级队列
带有阻塞效果的放取: put(), take().
三. 生产者消费者模型
3.1 生产者消费者模型与阻塞队列密不可分的关系
阻塞对列是生产者消费者模型的交易场所.
3.2 阻塞队列在生产者消费者模型的作用
a. 解耦合
解耦合之前, 服务器A直接和服务器B进行交互, 一旦服务器A中的代码发生了改变, 服务器B也需要做出相应的改变.(AB之间关系紧密)
解耦合之后, 服务器A不再与服务器B直接关联, 而是通过阻塞队列来进行交互, 降低了AB之间的关联度.
b. 削峰填谷
如果A传输给B的数据量激增, 而B没有这么大的接收能力, 就会导致服务器断线.
此时, 引入阻塞队列, 激增的数据就会在阻塞队列中进行缓冲, 输入给B的数据量不会超出B的接收能力.
四. 模拟实现阻塞队列
4.1 实现put方法
重点解读:
synchronized: 保证put操作的原子性.
while: 进行多次判断, 防止notify之后循环队列还是满的, 而导致之后的操作没有意义.
if(tail >= data.length): 表示一次循环已经结束了, 再从头开始.
this.notify(): 此时队列中有元素了, 可以进行take操作.
4.2 实现take方法
重点解读:
synchronized: 保证take操作的原子性
while: 进行多次判断, 防止notify之后队列还是空的, 导致后面的操作无意义.
4.3 生产者消费者模型
五.总结
1. 什么是阻塞队列(阻塞队列时带有阻塞效果的队列, 是线程安全的)
2. 阻塞队列的实例化(ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue)
3. 生产者消费者模型与阻塞队列密不可分的关系(阻塞队列是生产者消费者模型的交易场所)
4. 阻塞队列在生产者消费者模型的作用(解耦合, 削峰填谷)
4. 模拟实现阻塞队列