Java 7中的TransferQueue
原文链接,译文链接,作者:Alex Miller,译者:Greenster,校对:梁海舰
Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue
和其实现类LinkedTransferQueue
。
TransferQueue继承了BlockingQueue(
BlockingQueue又
继承了Queue
)并扩展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指这样的一个队列:当生产者向队列添加元素但队列已满时,生产者会被阻塞;当消费者从队列移除元素但队列为空时,消费者会被阻塞。
TransferQueue则更进一步,生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。新添加的transfer方法用来实现这种约束。顾名思义,阻塞就是发生在元素从一个线程transfer到另一个线程的过程中,它有效地实现了元素在线程之间的传递(以建立Java内存模型中的happens-before关系的方式)。
TransferQueue还包括了其他的一些方法:两个tryTransfer方法,一个是非阻塞的,另一个带有timeout参数设置超时时间的。还有两个辅助方法hasWaitingConsumer()和getWaitingConsumerCount()。
当我第一次看到TransferQueue时,首先想到了已有的实现类SynchronousQueue
。SynchronousQueue的队列长度为0,最初我认为这好像没多大用处,但后来我发现它是整个Java Collection Framework中最有用的队列实现类之一,特别是对于两个线程之间传递元素这种用例。
TransferQueue相比SynchronousQueue用处更广、更好用,因为你可以决定是使用BlockingQueue的方法(译者注:例如put方法)还是确保一次传递完成(译者注:即transfer方法)。在队列中已有元素的情况下,调用transfer方法,可以确保队列中被传递元素之前的所有元素都能被处理。Doug Lea说从功能角度来讲,LinkedTransferQueue实际上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。
Joe Bowbeer提供了一篇William Scherer, Doug Lea, and Michael Scott的论文,在这篇论文中展示了LinkedTransferQueue的算法,性能测试的结果表明它优于Java 5的那些类(译者注:ConcurrentLinkedQueue、SynchronousQueue和LinkedBlockingQueue)。LinkedTransferQueue的性能分别是SynchronousQueue的3倍(非公平模式)和14倍(公平模式)。因为像ThreadPoolExecutor这样的类在任务传递时都是使用SynchronousQueue,所以使用LinkedTransferQueue来代替SynchronousQueue也会使得ThreadPoolExecutor得到相应的性能提升。考虑到executor在并发编程中的重要性,你就会理解添加这个实现类的重要性了。
Java 5中的SynchronousQueue使用两个队列(一个用于正在等待的生产者、另一个用于正在等待的消费者)和一个用来保护两个队列的锁。而LinkedTransferQueue使用CAS操作(译者注:参考wiki)实现一个非阻塞的方法,这是避免序列化处理任务的关键。这篇论文还罗列了很多的细节和数据,如果你感兴趣,非常值得一读。
Java 7中的TransferQueue相关推荐
- 统计java文件中的代码行数
统计Java代码行数工具类 -- CodeCounterUtil.java 统计指定目录下的java文件中代码行数 -- public static int getCodeNumFromFo ...
- Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法
什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置 ...
- Java 8中一些常用的全新的函数式接口
这一篇属于菜鸟级博客,只是介绍了一些在Java 8中新出现的一些很有用的接口,通过一些简单的例子加以说明,没有深入地阐述. 函数式接口 什么是函数式接口? 函数式接口,@FunctionalInter ...
- 你还在 Java 代码中写 set/get 方法?赶快试试这款插件吧!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:Mr.ml https://blog.csdn.net/Ma ...
- 聊一聊Java 泛型中的通配符 T,E,K,V,?
点击上方"方志朋",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:glmapper juejin.im/post/5d57 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
- java treeset 删除_删除Java TreeSet中的最高元素
要删除最高元素,请使用pollLast()方法. 创建一个TreeSet并向其中添加元素-TreeSet tSet = new TreeSet(); tSet.add("78"); ...
- 如何优雅地在 Java 8 中处理异常
2019独角兽企业重金招聘Python工程师标准>>> 前言 Java 8 引入的流 (Stream) API 和 lambda 表达式为我们打开了新世界的大门,自此之后我们也可以在 ...
最新文章
- Python:从零搭建Redis-Scrapy分布式爬虫
- 小米4手机在DDMS下获取data/data目录权限
- findler mac 隐藏文件_Fiddler使用文档
- jquery 导航栏目
- 一种网络进程间通信的方式—— 管道
- bms中soh计算方式_BMS电池管理系统由浅入深全方位解析
- arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots
- 股票撤销st申请多长时间批复?
- Swing组件集合的事件处理(六)
- 框架分析--框架的类关系图
- 关于PG与Linux的HUGEPAGE/HUGETLBFS
- 云计算防止入坑之通过跑分看云服务器的性能,给各位云计算入门者的一些建议
- lighttpd 之九 配置信息加载
- py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())
- Js逆向:建筑市场监管平台
- 华为又招了一名天才少年!
- 腾讯万字Code Review规范
- vue.js 构建项目_使用Vue.js和AWS Amplify构建Chatbot
- 如何在本地进行一个IP访问多个域名
- 产品需求分析与市场分析方法汇总(SWOT+PDCA+波士顿矩阵BCG+5W2H分析法+STAR关键事件分析法+目标管理SMART+时间管理紧急重要矩阵+WBS任务分解法)
热门文章
- win7服务器 能否建立多个网站,windows7下weblogic10.3服务器下一个domain建多个server(端口)...
- php 的点代表什么意思,linux .(点)是什么意思
- python什么时候开始流行的_Python什么时候会被取代?
- postman请求参数区别
- jquery.validator验证后ajax提交出现错误解决
- VB6 中将数据导出到 Excel 提速之法
- 【引用】URLDownloadToFile_VB下载文件!
- 讨老婆之前要记熟的十句话
- 谷歌医疗AI商业化提速!Jeff Dean亲自挖来大总管
- 加州无人车路测历史性变革!远程遥控,真正无人