[JAVAEE] 线程安全的案例(二) - 阻塞队列 生产者消费者模型

目录

一. 什么是阻塞队列

二. 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. 模拟实现阻塞队列

上一篇:【数学二】一元函数积分学-定积分的应用-平面图形面积、旋转体体积、函数的平均值、平面曲线的弧长、旋转曲面面积


下一篇:RabbitMQ深层浅讲【通俗易懂】