Ch11-Java Collections 之 PriorityBlockingQueue

Ch11-Java Collections 之 PriorityBlockingQueue

March 2, 2020
Java | JUC
java

java.util.concurrent.PriorityBlockingQueue

struct

PriorityBlockingQueue 内部有个数组 queue 用来存放队列元素,size 用来存放队列元素个数,allocationSpinLockOffset 是用来在扩容队列时候做 cas 的,目的是保证只有一个线程可以进行扩容。其优先级主要是通过传入的 Comparator 实现的,最终优先级借助小根堆的方式快速出队。

1. 添加 #

操作 操作成功 操作失败
offer 返回 true 队列已满,扩容,插入,返回 true
add 返回 true 队列已满,扩容,插入,返回 true
put 无返回 队列已满,扩容,插入,无返回

1.1 put 说明 #

首先获取 lock 对队列进行进行加锁,如果队列已满,进行扩容,插入并调整小根堆,size 自增 1,并试着唤醒 notEmpy 里面的一个线程。最后释放 lock。

2. 获取 #

操作 操作成功 操作失败
poll 返回元素 队列为空,阻塞
take 返回元素 队列为空,阻塞

2.1 take 说明 #

首先获取 lock 对队列进行加锁,如果队列为空,则将当前线程放到 notEmpty 这个条件队列里面。如果队列不为空,那么出队成功。最后释放 lock。

3. 参考文献 #