作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
上面两篇博文分别介绍了BlockingQueue、ArrayBlockingQueue和LinkedBlockingQueue。这篇博文就来分析下PriorityBlockingQueue。
1、PriorityBlockingQueue的继承体系结构
public class PriorityBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
也是继承了AbstractQueue,实现了BlockingQueue、Serializable接口,与ArrayBlockingQueue、LinkedBlockingQueue的继承结构一模一样。
2、PriorityBlockingQueue的相关属性介绍
1)、默认容量
private static final int DEFAULT_INITIAL_CAPACITY = 11;
2)、最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
3)、这个数组代表的是一个平衡二叉堆,即queue[n]的子节点为queue[2n+1]和queue[2*(n+1)]
private transient Object[] queue;
4)、优先队列中的元素个数
private transient int size;
5)、比较器,如果为空,则为自然顺序
private transient Comparator<? super E> comparator;
6)、锁
private final ReentrantLock lock;
//为空时,进行阻塞的Condition
private final Condition notEmpty;
/**
* Spinlock for allocation, acquired via CAS.
*/
private transient volatile int allocationSpinLock;
7)、优先队列:主要用于序列化,这是为了兼容之前的版本。只有在序列化和反序列化才非空
private PriorityQueue<E> q;
3、PriorityBlockingQueue的构造函数介绍
PriorityBlockingQueue类中共有3个构造方法,如下
1)、创建一个默认容量大小为11的PriorityBlockingQueue对象。按照自然顺序进行排序
public PriorityBlockingQueue() {
this(DEFAULT_INITIAL_CAPACITY, null);
}
2)、创建一个指定大小的PriorityBlockingQueue对象。按照自然顺序进行排序
public PriorityBlockingQueue(int initialCapacity) {
this(initialCapacity, null);
}