Java教程

高并发编程之如何选择适合的阻塞队列

本文主要是介绍高并发编程之如何选择适合的阻塞队列,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

高并发编程之如何选择适合的阻塞队列

一、线程池选择的队列实例

  在我们使用到的线程池中,线程池有很多种类,不同种类的线程池锁选用的队列也是不一样的。

  • FixedThreadPool选取的是LinkedBlockingQueue
  • CachedThreadPool选取的是 SynchronousQueue
  • ScheduledThreadPool选取的是延时队列   

二、如何考虑队列的选取

       对于队列的选取,我们一般考虑一下5各方面,更具实际的应用场景做出选择。

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

 

这篇关于高并发编程之如何选择适合的阻塞队列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!