`
leogao_emcom
  • 浏览: 82493 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

有关Java 5.0+ 并发包的探讨-2 section -补充-2

阅读更多

Exchanger

Exchanger 类方便了两个共同操作线程之间的双向交换;
Exchanger 通常用于一个线程填充缓冲,而另一个线程清空缓冲的情况。当两个线程在屏障处集合时(交换点),它们交换缓冲,为了解释Exchanger的使用方法,先看看其实现原理,在Exchanger中最核心的方法是exchange, 其JDK的实现是:

 public V exchange(V x) throws InterruptedException {
        if (!Thread.interrupted()) {
            Object v = doExchange(x == null? NULL_ITEM : x, false, 0);
            if (v == NULL_ITEM)
                return null;
            if (v != CANCEL)
                return (V)v;
            Thread.interrupted(); // Clear interrupt status on IE throw
        }
        throw new InterruptedException();
    }

 

调用了doExchange子方法,我们来看看其具体的实现:

 

 private Object doExchange(Object item, boolean timed, long nanos) {
        Node me = new Node(item);                 // Create in case occupying
        int index = hashIndex();                  // Index of current slot
        int fails = 0;                            // Number of CAS failures

        for (;;) {
            Object y;                             // Contents of current slot
            Slot slot = arena[index];
            if (slot == null)                     // Lazily initialize slots
                createSlot(index);                // Continue loop to reread
            else if ((y = slot.get()) != null &&  // Try to fulfill
                     slot.compareAndSet(y, null)) {
                Node you = (Node)y;               // Transfer item
                if (you.compareAndSet(null, item)) {
                    LockSupport.unpark(you.waiter);
                    return you.item;
                }                                 // Else cancelled; continue
            }
            else if (y == null &&                 // Try to occupy
                     slot.compareAndSet(null, me)) {
                if (index == 0)                   // Blocking wait for slot 0
                    return timed? awaitNanos(me, slot, nanos): await(me, slot);
                Object v = spinWait(me, slot);    // Spin wait for non-0
                if (v != CANCEL)
                    return v;
                me = new Node(item);              // Throw away cancelled node
                int m = max.get();
                if (m > (index >>>= 1))           // Decrease index
                    max.compareAndSet(m, m - 1);  // Maybe shrink table
            }
            else if (++fails > 1) {               // Allow 2 fails on 1st slot
                int m = max.get();
                if (fails > 3 && m < FULL && max.compareAndSet(m, m + 1))
                    index = m + 1;                // Grow on 3rd failed slot
                else if (--index < 0)
                    index = m;                    // Circularly traverse
            }
        }
    }

 

  Slot类是从AtomicRefrence继承而来的,也就是说交换是基于原子操作的,另外从上可以看到是如何交换数据的!并且我试图补齐在其实现Class上的注释中的例子:

class FillAndEmpty {
	Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
	DataBuffer initialEmptyBuffer = new DataBuffer();
	DataBuffer initialFullBuffer = new DataBuffer();

	class FillingLoop implements Runnable {
		public void run() {       
			DataBuffer currentBuffer = initialEmptyBuffer;      
			try {         
				while (currentBuffer != null) {          
					addToBuffer(currentBuffer);          
					if (currentBuffer.full())            
						currentBuffer = exchanger.exchange(currentBuffer);        
					}      
				} catch (InterruptedException ex) { }}}

	class EmptyingLoop implements Runnable {
		public void run() {      
			DataBuffer currentBuffer = initialFullBuffer;       
			try {         
				while (currentBuffer != null) {          
					takeFromBuffer(currentBuffer);          
					if (currentBuffer.empty())            
						currentBuffer = exchanger.exchange(currentBuffer);        
					}      
				} 
			catch (InterruptedException ex) { }}

	void start() {
		new Thread(new FillingLoop()).start();
		new Thread(new EmptyingLoop()).start();
	}
}

  

 

0
2
分享到:
评论

相关推荐

    基于Vue、JavaScript、HTML、CSS的myshop电商平台设计源码

    该项目是一款基于Vue、JavaScript、HTML和CSS构建的myshop电商平台设计源码,总计包含94个文件,涵盖32个PNG图片、22个JavaScript文件、13个Vue组件文件、13个JPG图片文件、3个GIF图片文件、3个SCSS样式文件,以及其他必要的配置和管理文件。

    基于c语言的对自己电脑系统测试.zip

    基于c语言的对自己电脑系统测试.zip

    基于Labview的-转子动平衡测控系统

    基于Labview的--转子动平衡测控系统

    基于c语言的青蛙过河小游戏.zip

    基于c语言的青蛙过河小游戏.zip

    基于Springboot和Mysql的酒店管理系统代码(程序,中文注释)

    酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统-酒店管理系统 1、资源说明:酒店管理系统源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Windows ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDE

    基于DWR技术的Java与JavaScript实现的无需刷新的ChatRoom设计源码

    本项目为基于DWR技术的Java与JavaScript无刷新聊天室设计源码,包含31个文件,涵盖9个Java源文件、4个JavaScript脚本文件、4个JAR库文件、3个XML配置文件以及其他相关文件,旨在实现一个无需刷新的即时聊天功能。

    【含Matlab源码 期】基于matlab元胞自动机森林火灾.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于asp.net的兼职就业平台设计与实现.docx

    基于asp.net的兼职就业平台设计与实现.docx

    linux操作系统基础命令.zip

    手写数字识别

    2024C++期末大作业-英语翻译机(文件存储)

    2024C++期末大作业-英语翻译机.zip 电子词典模拟软件 1.创建关键词中英文词典 2.显示关键词中英文词典 3.输入英文关键字,查阅英汉词典 4.输入中文关键字,查阅英汉词典 5.退出

    基于Springboot和Mysql的在线考试系统代码(程序,中文注释)

    在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统-在线考试系统 1、资源说明:在线考试系统源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Windows ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDE

    在Java中使用DES进行加解密的示例DESUtil.zip

    在Java中使用DES进行加解密的示例DESUtil,注意,DES算法为不安全算法,主要因为它的56位密钥太短,容易被暴力破解。建议使用更安全的加密算法,如AES。

    水果分类数据集22万张262类别.7z

    重要说明:图片数量太多,图片分辨率都调整为104x128 数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):225639 分类类别数:262 更多信息:https://blog.csdn.net/FL1623863129/article/details/142592763

    VMware-player-full-17.5.0-22583795.zip

    VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip VMware-player-full-17.5.0-22583795.zip

    3d_magic.apk

    3d_magic.apk

    基于Springboot和Vue的旅游管理系统源码 旅游管理系统代码(程序,中文注释)

    旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统-旅游管理系统 1、资源说明:旅游管理系统源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Windows ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDE

    oracle客户端OCI文件,版本19.23-dbru

    oracle的OCI库文件19.23,dbru,java

    Matlab 软件基础入门

    本文件是一份关于 Matlab 软件基础入门的文本文件,旨在为初学者提供基本的 Matlab 软件使用方法和技巧。文件内容涵盖了 Matlab 的基本概念、语法规则、常用函数以及一些实用的编程技巧。通过本文件的学习,读者可以快速掌握 Matlab 软件的基本操作,为进一步学习和应用 Matlab 软件打下坚实的基础。 本文件的内容丰富、结构清晰,适合初学者系统学习和掌握 Matlab 软件的基础知识和技能。同时,本文件也提供了一些实用的编程技巧和应用实例,帮助读者更好地理解和应用 Matlab 软件。

    ofd阅读器版本 3.0

    ofd阅读器版本 3.0

    Chrome 浏览器惊现严重漏洞

    漏洞 Chrome 浏览器惊现严重漏洞

Global site tag (gtag.js) - Google Analytics