JCU中SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue简析
阅读文本大概需要3分钟。
0x01:SynchronousQueue
SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列,但是isEmpty()方法永远返回是true,remainingCapacity() 方法永远返回是0,remove()和removeAll() 方法永远返回是false,iterator()方法永远返回空,peek()方法永远返回null。
声明一个SynchronousQueue有两种不同的方式,它们之间有着不太一样的行为。公平模式和非公平模式的区别:
如果采用公平模式,SynchronousQueue会采用公平锁,并配合一个FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略。
如果是非公平模式(SynchronousQueue默认),SynchronousQueue采用非公平锁,同时配合一个LIFO队列来管理多余的生产者和消费者,而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。
0x02:LinkedBlockingQueue
LinkedBlockingQueue是无界的,是一个无界缓存的等待队列。
基于链表的阻塞队列,内部维持着一个数据缓冲队列(该队列由链表构成)。当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。
LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。
0x03:ArrayListBlockingQueue
ArrayListBlockingQueue是有界的,是一个有界缓存的等待队列。
基于数组的阻塞队列,同LinkedBlockingQueue类似,内部维持着一个定长数据缓冲队列(该队列由数组构成)。ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。
ArrayBlockingQueue在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于LinkedBlockingQueue;按照实现原理来分析,ArrayBlockingQueue完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea之所以没这样去做,也许是因为ArrayBlockingQueue的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。ArrayBlockingQueue和LinkedBlockingQueue间还有一个明显的不同之处在于,前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的Node对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。
ArrayBlockingQueue和LinkedBlockingQueue是两个最普通、最常用的阻塞队列,一般情况下,处理多线程间的生产者消费者问题,使用这两个类足以。
☆
往期精彩
☆
01 漫谈发版哪些事,好课程推荐
02 Linux的常用最危险的命令
03 互联网支付系统整体架构详解
04 优秀的Java程序员必须了解的GC哪些
05 IT大企业有哪些病,别被这些病毁了自己?
关注我每天进步一点点
你点的在看,我都当成了喜欢
JCU中SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue简析相关推荐
- 线程池三种队列使用,SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
使用方法: private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime ...
- APP:校园网登录app—中小南—源码简析
转载请注明出处:http://www.cnblogs.com/wondertwo/p/5392496.html 最近一段时间真的很惭愧,一直琐事缠身没有空闲的时间来安安心心写一篇博客,直到今晚基本忙完 ...
- URL链接中的utm_source,utm_medium简析
工作中须要分析一些链接,统计分析一些信息.比方例如以下的链接: http://lightapplication.xxxx.com/?utm_source=ucweb&utm_medium=cp ...
- 86-浏览器缓存中的部分变量简析
1.Last-Modified 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(HttpReponse Header ...
- C++中for循环语句简析
1 for循环语句概述 for循环语句的语法是 for(初始化语句; 条件语句; 表达式语句) { 执行语句; } 其中,初始化语句用于每次循环过程中都要修改的变量进行初始化:而条件语句用来控制循环, ...
- 计算机在气象上的应用浅论,简析计算机网络在气象服务中的应用原稿
<简析计算机网络在气象服务中的应用(原稿).doc>由会员分享,可免费在线阅读全文,更多与<简析计算机网络在气象服务中的应用(原稿)>相关文档资源请在帮帮文库(www.woc8 ...
- mysql job_MySQL数据传输中dtle 之 job 实现简析-爱可生
原标题:MySQL数据传输中dtle 之 job 实现简析-爱可生 作者:吕海龙 爱可生 DTLE 团队成员,负责 DTLE 开发 ,日常问题处理以及相关问题的排查. 本文来源:原创投稿 *爱可生开源 ...
- 今晚直播 | 强化学习在比赛和自动机器学习中的应用简析
「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...
- Python中的基本函数及其常用用法简析
分享Python中的基本函数及其常用用法简析,首先关于函数的解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程 ...
最新文章
- C++知识点2——指针、引用基础
- awk print 的用法
- iphonex黑屏开不了机_iphonex黑屏就算强制开机也开不了,是什么原因?_杭州维修...
- 黑盒测试——自动饮料售货机
- matlab氢原子杂化轨道,网络版原子和分子结构可视化程序的开发
- 高中计算机基础知识,高中计算机会考基本知识点
- jquery 滚动条位置的
- hdu 3887 Counting Offspring
- 发送手机验证码通过调用第三方网易云信API(flask项目)
- 03MyBatis动态sql
- [SQL]查询及删除重复记录的SQL语句
- linux内核 list 使用,使用linux 内核中代码之--list
- SCM供应链管理系统对更多行业未来
- python 解压zip rar 7z文件
- css如何使图片在右下角,这个右下角折角用css怎么画出来?
- python做淘宝客_python 做淘宝客程序(2)
- 华为云上传docker镜像
- 美术 3.2 2D动画Spine基础教学
- Angular2属性绑定
- 2.5 信道的极限容量