前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java长度为0的阻塞对列-TransferQueue详解

Java长度为0的阻塞对列-TransferQueue详解

作者头像
JavaEdge
发布于 2020-05-27 03:41:38
发布于 2020-05-27 03:41:38
1K0
举报
文章被收录于专栏:JavaEdgeJavaEdge

Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue。

TransferQueue继承了BlockingQueue并扩展了一些新方法。 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操作实现一个非阻塞的方法,这是避免序列化处理任务的关键

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(76) 并发容器 - 各种队列 / 计算机程序的思维逻辑
本节,我们来探讨Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为: 无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockingQueue和LinkedBlockingDeque 优先级阻塞队列:PriorityBlockingQueue 延时阻塞队列:DelayQueue 其他阻塞队列:SynchronousQueue和LinkedT
swiftma
2018/01/31
6120
初识队列
LinkedTransferQueue = 阻塞队列+链表结构+TransferQueue
kwan的解忧杂货铺
2024/08/05
830
BlockingQueue队列
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。
物流IT圈
2019/07/16
5650
TransferQueue实例
TransferQueue(java7引入)继承了BlockingQueue(BlockingQueue又继承了Queue)并扩展了一些新方法。生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。
code4it
2018/09/17
1.6K0
高并发之并发容器,了解多少(从入门到超神)
在上面已经提到过ConcurrentHashMap,ConcurrentHashMap相比Hashtable能够进一步提高并发性,其原理图如下:
好好学java
2018/10/18
6070
每日一面 - java中LinkedTransferQueue和SynchronousQueue有什么区别?
LinkedTransferQueue 是一种 TransferQueue,SynchronousQueue 是一种 BlockingQueue。
干货满满张哈希
2021/04/12
8940
Java多线程知识小抄集(二)
27. ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0.75f,分段16,每个段的HashEntry<K,V>[]大小为2。键值都不能为null。每次扩容为原来容量的2倍,ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。在获取size操作的时候,不是直接把所有segment的count相加就可以可到整个ConcurrentHashMap大小,也不是在统计siz
用户1263954
2018/01/30
5980
Java多线程知识小抄集(二)
Java核心知识点整理大全9-笔记
4.1.14.5. PriorityBlockingQueue(compareTo 排序实现优先)
用户10920956
2024/01/18
1150
Java核心知识点整理大全9-笔记
死磕 java集合之LinkedTransferQueue源码分析
(4)LinkedTransferQueue与SynchronousQueue有什么异同?
彤哥
2019/07/08
5760
死磕 java集合之LinkedTransferQueue源码分析
java中的Queue家族详解
java中Collection集合有三大家族List,Set和Queue。当然Map也算是一种集合类,但Map并不继承Collection接口。
程序那些事
2020/07/08
5930
java中的Queue家族详解
干货 | 45张图庖丁解牛18种Queue,你知道几种?
在讲《21张图讲解集合的线程不安全》那一篇,我留了一个彩蛋,就是Queue(队列)还没有讲,这次我们重点来看看Java中的Queue家族,总共涉及到18种Queue。这篇恐怕是市面上最全最细 讲解Queue的。
悟空聊架构
2020/09/10
5290
【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
原文出处http://cmsblogs.com/ 『chenssy』 前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会锁住整个队列呢?有!答案就是LinkedTransferQueue。 LinkedTransferQueue是
用户1655470
2018/04/26
7230
【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法.
小小工匠
2021/08/17
3130
阻塞队列实现之LinkedTransferQueue源码解析
LinkedTransferQueue在JDK1.7版本诞生,是由链表组成的无界TransferQueue,相对于其他阻塞队列,多了tryTransfer和transfer方法。
烂猪皮
2023/09/04
1480
阻塞队列实现之LinkedTransferQueue源码解析
解读 Java 并发队列 BlockingQueue
转自:https://javadoop.com/post/java-concurrent-queue
Java技术江湖
2019/09/25
6130
深入探究Java中的TransferQueue:机制、特性与应用场景
TransferQueue是Java并发包java.util.concurrent中的一个接口,它扩展了BlockingQueue接口。与传统的BlockingQueue不同,TransferQueue提供了更精确的控制,允许生产者和消费者线程之间进行更直接的交互。它引入了两种新的操作方法:transfer(E e)和tryTransfer(E e, long timeout, TimeUnit unit),这两种方法提供了在数据可用时的等待/传输语义。
公众号:码到三十五
2024/03/19
2300
10分钟搞定 Java 并发队列好吗?好的
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand i
用户4172423
2020/08/31
6080
10分钟搞定 Java 并发队列好吗?好的
解读Java阻塞队列BlockingQueue的实现
上篇文章我们介绍了队列的基类接口Queue它定义了所有实现队列的类必须拥有的方法行为而BlockingQueue阻塞队列接口继承了Queue接口,此外BlockingQueue队列接口是Java并发包里面所有实现线程安全队列的基类接口。
我是攻城师
2018/09/30
5.6K0
解读Java阻塞队列BlockingQueue的实现
Java中的BlockingQueue1 Java中的阻塞队列2 生产者和消费者例子2 Java里的阻塞队列
1 Java中的阻塞队列 1.1 简介 一种支持两个附加操作的队列,是一系列阻塞队列类的接口 当存取条件不满足时,阻塞在操作处 队列满时,阻塞存储元素的线程,直到队列可用 队列空时,获取元素的线程会
JavaEdge
2018/05/16
1.6K0
【小家java】BlockingQueue阻塞队列详解以及5大实现(ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue...)
在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。
YourBatman
2019/09/03
1.3K0
【小家java】BlockingQueue阻塞队列详解以及5大实现(ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue...)
推荐阅读
相关推荐
(76) 并发容器 - 各种队列 / 计算机程序的思维逻辑
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档