Ch11-Java Collections 之 PriorityBlockingQueue
March 2, 2020
java.util.concurrent.PriorityBlockingQueue
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。