面试系列之阻塞队列(BlockeQuery)
- ArrayBlockeQuery:
- 底层是数组 加入队和出队双指正的方式形成循环数组,减少数组移动的性能消耗。并且保证先进先出
- 使用一个ReentrantLock加上两个Condition保证线程安全以及阻塞交互。由于入队和出队都使用同一把锁(入队和出队互斥),所以性能相对较低
- LinkedBlockingQueue
- 底层采用单向链表的结构,head、tail指针,保证先进先出
- 使用两把锁以及对应的两个Condition,将入队操作和出队操作分开,提升性能。这也是线程池使用它的原因。
- LinkedBlockingDeque
- 底层使用双向链表,头尾都可出队入队。
- 类似ArrayBlockeQuery使用一个lock加两个condition
- SynchronousQueue
- 底层分为两种模式,公平的链表结构或则非公平的栈结构。
- 值得注意的是同步队列并不存在存储容量,每个生产者会持有一个等待交换的资源进入阻塞从而等待和一个消费者交换数据。而消费者也会阻塞等待一个生产者来交换数据并唤醒自己。而多个消费者和生产者根据不同的模式,进入链表或者栈进行排队
- PriorityBlockingQueue
- 底层采用(数组)大顶堆或者小顶堆 保证优先级的顺序
- 注意入队的上浮操作,以及出队的下沉操作
- 可扩容
- DelayQueue
- 底层使用PriorityBlockingQueue 进行时间的排序
- 始终会有一个线程的等待时间和堆顶元素的时间保持一致
对于不同的阻塞队列进行选择时:
1.不同的功能
2.不同的数据结构
3.不同的性能
4.容量
5.是否能扩容