阻塞队列BlockingQueue

1,简介

1)BlockingQueue接口定义:继承Queue接口,并且支持两个附加操作的队列。additionally supports operations
获取元素时,等待队列非空。wait for the queue to become non-empty when retrieving an element
存储元素时,等待队列可用。wait for space to become available in the queue when storing an element
2)应用场景:常用于生产者消费者场景
生产者往阻塞队列中添加元素,当队列满时,阻塞线程等待队列可用
消费者从阻塞队列中获取元素,当队列空时,阻塞
3)队列操作
Queue提供:add、remove、element, offer、poll、peek
阻塞队列额外操作:put、take,超时offer、超时poll

image.png

4)额外操作
put:插入元素,如果必要的话阻塞等待队列可用。Inserts the specified element into this queue, waiting if necessary for space to become available.
超时offer:插入元素,最多阻塞等待time超时时间队列可用。waiting up to the specified wait time if necessary for space to become available.
5)生产者消费者模型
image.png

image.png

6)JDK实现类列表
image.png

公平访问队列:等待的线程在获取锁竞争时,按照等待时间,先等待的先获取后等待的后获取
非公平访问:获取的时候,所有等待的线程都有可能获取到锁
ReentrantLock:控制公平锁和非公平锁,公平锁会降低队列性能,默认使用非公平锁

2,ArrayBlockingQueue数组实现的有界队列,ReentrantLock+条件队列

image.png

image.png

put实现
image.png

image.png

take实现
image.png

image.png

超时实现,基于条件队列awaitNanos
image.png

image.png

3,LinkedBlockingQueue链表实现的capacity或者MAX_VALUE的队列

image.png

image.png

put实现
image.png

take实现
image.png

4,PriorityBlockingQueue基于堆结构的优先级无界阻塞队列

image.png

image.png

put实现
image.png

take实现
image.png

5,SynchronousQueue不存储元素的阻塞队列

Transfer接口put操作的时候e值为数据data,take操作的时候e值为null

image.png

TransferQueue实现
image.png

队列为空或者是和队尾数据类型一致
image.png

image.png

awaitFulfill方法,终止条件是s的值是否被修改。如s节点是data节点,就会被修改为null;如果是request节点,就会被修改为data
image.png

image.png

put和take实现
image.png

image.png

你可能感兴趣的:(阻塞队列BlockingQueue)