Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。
Queue的实现
Queue的实现在Java中主要有三种,即:
1.普通的队列其又分为了队列和堆(优先级队列)
2.双端队列Deque
3.阻塞队列:最为有名的队列实现。
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞(这就需要使用到锁)。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.
非阻塞队列:
1.ConcurrentLinkedQueue, (基于链表的并发队列)
实现:是基于节点Node的单向链表来实现的、线程安全的队列。其中的大多数属性和节点被volatile所修饰,并发访问不需要同步。
优点:它在队列的尾部添加元素并从头部删除它们,所以不需要知道队列的大小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。
缺点:收集关于队列大小的信息会很慢,需要遍历队列。
是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。该队列不允许null元素。
ConcurrentLinkedQueue重要方法:
Add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,这两个方法投有任何区别)
Poll()和peek()都是取头元素节点,区别在于前者会删除元素,后者不会
2.PriorityQueue, (优先级队列)
Priority queue represented as a balanced binary heap: the two* children of queue[n] are queue[2*n+1] and queue[2*(n+1)].
实现:底层为一个Obj数组,其为采用数组存储的堆结构。
PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
双端队列:
1.ArrayDeque, (数组双端队列)Deque 双端队列 Deque允许在队列的头部活尾部都可以进行出队和入队操作。
特点:队列维护了一个head哨兵,队列维护了一个tail哨兵
阻塞队列:
2)实现阻塞接口的: