高并发编程之如何选择适合的阻塞队列
作者:互联网
高并发编程之如何选择适合的阻塞队列
一、线程池选择的队列实例
在我们使用到的线程池中,线程池有很多种类,不同种类的线程池锁选用的队列也是不一样的。
- FixedThreadPool选取的是LinkedBlockingQueue
- CachedThreadPool选取的是 SynchronousQueue
- ScheduledThreadPool选取的是延时队列
二、如何考虑队列的选取
对于队列的选取,我们一般考虑一下5各方面,更具实际的应用场景做出选择。
- 功能性:更具实际的场景选用不同的阻塞队列,比如延时,排序等功能,如果用到排序功能,这个时候就需要考虑PriorityBlockingQueue队列
- 容 量:从容量方面考虑也是一个关键的因素,如果队列有存储的要求或者是直接传递的要求,就要选择不同的阻塞队列。有固定容量的队列 如:ArrayBlockingQueue;默认是无限容量的队列 如:LinkedBlockingQueue,有的队列没有任何容量的,如同步队列SynchronousQueue;DelayQueue的容量为Integer.MAX_VALUE,不同的队列之间千差万别,我们需要根据任务数量来推算出合适的队列。
- 能否扩容:从扩容方面考虑 ,在开发过程中,对于一些业务我们没有办法估计他的容量,业务可能有高峰期和低谷期,开一个固定容量无法满足业务需求,这个时候需要选择动态扩容。所以 ArrayBlockingQueue是不可以使用的,他在创建时容量就固定了,无法扩容。PriorityBlockingQueue 即使在指定了初始容量之后,后续如果有需要,也可以自动扩容。所以 我们可以根据是否需要扩容来选取合适的队列。
- 内存结构:队列的内存结构分为两种,一种是数据结构的,如ArrayBlockingQueue,还有一种是链表结构的,如LinkedBlockingQueue,ArrayBlockingQueue 没有链表所需要的“节点”,空间利用 率更高。所以如果我们对性能有要求可以从内存的结构角度去考虑这个问题。
- 性能:是从性能的角度去考虑。比如 LinkedBlockingQueue 由于拥有两把锁,它的操 作粒度更细,在并发程度高的时候,相对于只有一把锁的 ArrayBlockingQueue 性能会更好。 另外,SynchronousQueue 性能往往优于其他实现,因为它只需要“直接传递”,而不需要存 储的过程。如果我们的场景需要直接传递的话,可以优先考虑 SynchronousQueue
标签:容量,队列,编程,选取,并发,线程,SynchronousQueue,ArrayBlockingQueue 来源: https://www.cnblogs.com/huwcsj/p/15688844.html