功能说明
要理解SynchronousQueue首先就是要知道它的作用,只有知道这个类存在的目的和提供的功能,再能再读源码的时候不迷路。
我们在之前的学习中,如果线程间要交换数据一般都是用一个通过公共变量或者一个同步阻塞队列,生产者线程设置变量或者往队列中put值,消费者线程则读取变量或者从队列中take。
而SynchronousQueue则不需要存储线程间交换的数据,它的作用更像是一个匹配器,使生产者和消费者一一匹配。
一般流程
比如当一个线程调用了put方法时,发现队列中没有take线程,那么put线程就会阻塞,当take线程进来时发现有阻塞的put线程,那么他们两个就会匹配上,然后take线程获取到put线程的数据,两个线程都不阻塞。
反之一个线程调用take方法也会阻塞线程,当一个调用put方法的线程进来后也会与之匹配。
如果一个take或者put线程进来发现有同类的take或者put线程在阻塞中,那么线程会排到后面,直到有不同类的线程进来然后匹配其中一个线程。
通过流程描述相信对SynchronousQueue有了一定的了解,也知道SynchronousQueue为什么不用存储元素。
源码分析
通过查看SynchronousQueue的take与put方法发现都是调用的一个属性transferer的transfer方法,而transferer属性是SynchronousQueue的抽象静态内部类Transferer。Transferer有两个子类TransferQueue和TransferStack;
在SynchronousQueue构造方法中通过传递的参数fair来判断是创建TransferQueue还是TransferStack,通过参数fair来看TransferQueue应该是公平模式,那么TransferStack就是非功能模式。
公平模式TransferQueue实现
首先它有一个内部类QNode,通过上面分析发现可能会出现多个消费者或者多个生产者,他们就会形成一个队列,而QNode就是用来组成一个队列的链表。
QNode主要有四个属性:
QNode next:表示下一个节点;
Object item;这里实际上是put出去的数据,take方法生成的节点这里为null;
Thread waiter;阻塞的线程,一般是生成这个节点的线程阻塞,其他线程进来获取到了数据后会唤醒;
boolean isData:true则是put生成的,false表示是take生成的;
既然take与put都依赖transfer方法,那么我们就来看transfer的实现,源码太长就不贴出来了,直接看总结的流程图:
因为这个方法并没有采用锁来控制,所以在整个流程中还有很多判断,这些都是次要的,这里整理的是主要关键的流程。
简单说明一下,整个流程就是依赖QNode链表,QNode的isData来区分是take还是put方法,链表中的节点的isData一定是相同的,QNode的item是take和put线程交换的数据,只不过take方法交换的数据是null。
可以看出来每次可以匹配的时候都是拿的最前面的节点进来返回数据。
非公平模式TransferStack
同样TransferStack也有一个链表结构叫做SNode ,SNode 的主要属性如下:
SNode next: 下一个节点;
SNode match:与之匹配成功的节点;
Thread waiter:阻塞的线程;
Object item:要给出去的值;
int mode:节点分类,用于区分put还是take;
同样整理了transfer的源码流程图,具体如下图:
同样都是用链表实现,但是这个首先结构不一样,多一个match表示与之匹配的节点。
通过流程可以看到mode一个有三个值,除了0,1外还有一个2用来表示正在匹配中的节点。主要就是在上图中红框部分,在发现头部节点不是进行中时,当前线程就会创建一个匹配中的节点,然后加到头部,最后去和后面的节点匹配。
如果发现正在匹配中则会把匹配的节点从链表中移除。
通过流程分析可以看出TransferStack是后进来的线程放到了头部,会先进行匹配。
以上是java的SynchronousQueue是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。