- ConcurrentLinkedQueue
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
并发的队列主要分为阻塞队列和非阻塞队列,阻塞队列使用锁实现,非阻塞队列使用CAS实现
ConcurrentLinkedQueue:线程安全的无界非阻塞队列,使用单向链表存储,入队和出队使用CAS实现
常用的操作:
- offer:队尾添加元素,使用CAS
- add:内部调用offer 进行添加
- poll:队头获取并移除元素:使用CAS
- peek:获取队头元素,不移除:使用CAS
- size:计算队列个数,并发环境不是很有用,因为CAS没有加锁,在计算期间可能用删除或者添加
- remove(obj):如果存在则删除,如果有多个则删除第一个:使用CAS
- contains:遍历判断是否含有,结果与size 函数类似也不是很准确
LinkedBlockingQueue:使用独占锁ReentrantLock实现的阻塞安全队列,默认容量是0x7ffffff,用户也可以自己指定容量,所以从一定意义上说是一个有界阻塞队列
ArrayBlockingQueue:内部使用有界数组进行存储
put 和take 使用条件变量condition
offer 和poll通过简单的加锁进行操作
PriorityBlockingQueue:带有优先级的无界阻塞队列,每次出队返回优先级最高或者最低的元素,内部使用平衡二叉树堆实现
PriorityBlockingQueue使用
DelayQueue:无界阻塞延迟队列,队列中每个元素都有过期时间,获取元素时,只有过期元素才会出队列,队头元素是最快过期的,内部使用PriorityBlockingQueue存储
DelayQueue使用