并发容器BlockingQueue总结
2019-07-13 本文已影响40人
王侦
LinkedBlockingQueue.png
1.入队和出队的四种方式
四种方式的不同主要反映在怎么处理从空队列中取元素和往满队列中插入元素。
对于无界队列,使用put/offer永远不会出现满的情况。
2.七个阻塞队列
- ArrayBlockingQueue
基于数组的有界阻塞队列
使用单锁 - LinkedBlockingQueue
基于链表的有界阻塞队列
采用双锁机制,锁分离技术实现入队出队互不阻塞 - LinkedBlockingDeque
基于双向链表的有界阻塞队列
使用单锁
可用于工作密取的场景 - SynchronousQueue
不存储元素的阻塞队列,每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。队列没有任何内部容量。
公平模式使用dual queue算法-TransferQueue
非公平模式使用dual stack算法-TransferStack
适合传递性场景 - LinkedTransferQueue:
基于链表的无界阻塞队列
基于松弛型dual queue算法
总之,结合了ConcurrentLinkedQueue松弛算法以及SynchronousQueue的dual queue算法 - PriorityBlockingQueue
支持优先级排序的无界阻塞队列
扩容时使用allocationSpinLock简单的乐观锁,使得在分配新数组内存空间过程中,其他线程线程还可以使用数组,提高了并发性。 - DelayQueue
无界阻塞优先队列,存储实现Delayed接口元素
实际存入PriorityQueue
使用Leader-Follower模式变体最小化不必要的定时等待
适合缓存系统与定时任务调度场景