ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-14 17:03:25  阅读:194  来源: 互联网

标签:容量 队列 编程 选取 并发 线程 SynchronousQueue ArrayBlockingQueue


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

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

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

  • 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有