ConcurrentlinkedQueue
是非阻塞队列,使用内部类Node
封装任务,组成单向链表,使用CAS保证出入队的线程安全性ArrayBlockingQueue
,该队列是基于Object
数组的有界队列,实例化时必须指定容量,使用ReentrantLock
保证线程安全,构造函数的第二个参数可以指定是否公平newFixedThreadPool
中使用的LinkedBlockingQueue
,该队列使用内部类Node
封装任务,由Node
组成双向链表,不提供初始化容量的话默认容量是Integer.MAX_VALUE
,使用ReentrantLock
保证线程安全;newCachedThreadPool
中使用的SynchronousQueue
,容量为1,使用ReentrantLock
保证线程安全;PriorityBlockingQueue
是具有优先级的阻塞队列,使用ReentrantLock
保证出入队的线程安全,放入队列的任务需要实现Comparable
接口,实现comparato()
方法作比较确定元素优先级,使用Object
数组保存任务,默认容量为11,该数组可扩容,使用CAS和一个状态位来保证扩容的安全性,扩容规则是如果length
<64,则扩容为原来的2倍再+2,如果大于等于64,则扩容为原来的1.5倍;
int newCap = oldCap + ((oldCap < 64) ?
(oldCap + 2) :
(oldCap >> 1));