说明
在并发编程中,有时候需要使用线程安全的队列。
实现线程安全的队列有两种方式:
- 阻塞队列
- 非阻塞队列
阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。
支持阻塞的插入方法offer:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
支持阻塞的移除方法take:在队列为空时,获取元素的线程会等待队列变为非空。
例子
生产线程1往阻塞队列里面添加新的数据,当阻塞队列满的时候(针对有界队列),生产线程1将会处于阻塞状态,直到消费线程2从队列中取走一个数据;消费线程2从阻塞队列取数据,当阻塞队列空的时候,消费线程2将会处于阻塞状态,直到生产线程1把一个数据放进去。
应用场景
阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。
非阻塞队列
非阻塞队列:若队列为空从中获取元素则会返回空,若队列满了插入元素则会抛出异常。
有界与无界
有界队列
有固定大小的队列。比如设定了固定大小的ArrayBlockingQueue,又或者大小为0,只是在生产者和消费者中做中转用的 SynchronousQueue
无界队列
没有设置固定大小的队列。这些队列的特点是可以直接入列,实际上不会有无限大的容量:
- 内存有限,过多会导致内存溢出
- 队列中的元素不能超过
Integer.MAX_VALUE
一般生成环境中不会使用
参考:
https://blog.csdn.net/u022812849/article/details/114698692
https://www.jianshu.com/p/b1d383d4021c
