可以使用JDK提供的Exchager类进行同步交换:进行数据交换的双方将互相等待对方,直到双方的数据都准备完毕,才进行交换。Exchager类很少用到,但理解数据交换的时机却十分重要,这是一个基于trade-off的系统设计。下述分析方法能扩展到诸多系统设计的场景中,帮助我们更好的进行trade-off。

《Java并发编程实战》中介绍了判定数据交换时机的两种方案,却不甚清晰。从“时机选择的目的”出发,实际上存在着三种方案,各方案又有优劣,从而产生了trade-off。本文比较了这三种方案,通过对数据交换时机的分析加强trade-off的意识。

定义

数据交换:在Exchanger的两方栅栏机制中,双方互相等待对方的数据。

如读线程在读取发生前持有“空缓存”,写线程在写入完成后持有“满缓冲”(“满”只表示写入完成),那么数据交换就是指将读线程的“空缓冲”与写线程的“满缓冲”交换。

方案比较

依据“时机选择的的目的”,存在三种方案:

方案1. 交换次数最少

从交换次数最少的目的出发,交换行为应该发生在缓冲满和缓冲空时,这两种情况下都不得不发生交换,以满足最低的响应需求。

缓冲满时(填充线程的缓冲),填充任务发现无法继续填充缓冲区,就发起交换,以减少数据(到空)继续填充;缓冲空时(清空线程的缓冲),清空任务发现无法继续清空,就发起交换,以增加数据(到满)继续清空。

也可以将实际的交换任务委派给专门的交换线程,填充任务和清空任务都向该线程申请执行交换。

方案2. 交换最及时(响应最及时)

从响应最及时的目的出发,交换行为应该发生在缓冲刚增加数据和缓冲刚减少数据时,以满足“存在数据即交换”的最高的响应需求。

这种方案相当于去掉了缓冲区。一方面,一旦缓存不空就立刻发生交换,交换后就没有了数据;另一方面,一旦缓存空就开始交换数据,交换后缓存就不空。看起来数据根本需要写入缓存就完成了交换。

也可以设置一个特别小的缓冲,比如1个字节。但交换区的缓冲减小,只会让交换双方各自维护的缓冲区加大。

方案3. 适度的交换频率和响应

很明显:交换次数最少的话,一些数据的处理过程就将延迟;响应最及时的话,交换频率太高,很浪费性能,甚至大型系统中耗电都会成为问题。

所以可采用折中的方案,达到适度的交换频率和响应:交换行为发生在缓冲被填充到一定程度并保持一定时间 t 后,同时一旦缓冲满或缓冲空就立即发生交换。

如果将时间 t 设置为 0,则退化为方案2;如果将时间 t 设置无穷大,则退化为方案1,从而既能兼容以上两种方案,又能根据实际响应需求静态配置,甚至根据实时的性能分析结果进行动态调整。

如果将Exchager比作“数据交换系统”,方案3即完成了对“数据交换系统”的trade-off,也就是基于成本(如耗电等)、收益(如延迟等)对系统设计作出的权衡、妥协。

总结

通过对三种Exchager数据交换时机的分析,加强了我们在系统设计中的trade-off意识。

《Java并发编程实战》中介绍了方案1和方案3。直接在书中看到方案1和方案3可能很难理解,但分析了上述trade-off过程后,就能轻松理解数据交换的时机了。


本文链接:从Exchager数据交换到基于trade-off的系统设计
作者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。

从Exchager数据交换到基于trade-off的系统设计的更多相关文章

  1. 基于Http替补新闻WebService数据交换

    该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...

  2. 【AS3】Flash与后台数据交换四种方法整理

    随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...

  3. json 数据交换格式与java

    http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...

  4. 常用两种数据交换格式之XML和JSON的比较

    目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...

  5. android之JSON 进行网络数据交换

    什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成,很适合于server与client的交互. J ...

  6. XML和JSON两种数据交换格式的比较

    在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...

  7. Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

    本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...

  8. 【计算机网络基础】数据交换技术和多路复用技术的正(nao)确(can)打开方式

    交换的作用   数据交换是计算机网络中两个终端进行数据传输的方式,它又可以分成两种类型:电路交换和分组交换.很显然,问题的核心在于“交换”,那么我们首先要思考的是:交换的作用是什么?   “交换”的作 ...

  9. servlet与ajax数据交换(json格式)

    JSON数据格式: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于的一个子集. JSON采用完全独 ...

随机推荐

  1. Python Oracle数据库监控

    有的时候无法使用Oracle自带的OEM监控,那么就需要确定一个监控方案. 此方案,使用Python+Prometheus+Grafana+Oracle 1.监控配置表 -- Create table ...

  2. Swift语法笔记

    Guard guard是一种条件判断语句,可以类比if.assert.如果条件不符合,guard的else语句就运行,从而退出这个函数. 具体写法如下: func fooGuard(x: Int?) ...

  3. 添加MyEclipse WebSphere Portal Server支持(二)

    MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.支持WebSphere Portal部署 当您为WebSphere Portal 7.0或8. ...

  4. <NET CLR via c# 第4版>笔记 第15章 枚举类型和位标志

    15.1 枚举类型 枚举定义的符号是常量值. C#编译器编译时,会用数值替换符号,不再引用定义了符号的枚举类型.可能会出现一些版本问题. Enum.IsDefined(Type enumType, o ...

  5. L228 the complicated issue of equality: non-disabled actors play disabled roles

    Bryan Cranston’s defence of playing a wheelchair user in the new comedy-drama The Upside has underli ...

  6. linux 简单常用命令

    kill -3 pid就是发送信号3也就是SIGQUIT给进程pid.kill -9 就是发信号9也就是SIGKILL. pwd: 打印当前工作目录ls:默认显示当前工作目录内容cd:改变当前工作目录 ...

  7. SWIFT Optional Value

    SWIFT中有一个类型定义叫可选值,在变量类型后面加一个?号即可定义一个类型为Optional Value的变量,当在使用变量时要用到强制解包!. 如在页面上有一个可选输入年龄的框,在接受数据的时间就 ...

  8. Skynet服务器框架(十) CentOS 防火墙设置

    引言: 今天修改了 skynet 服务器的 IP 地址(即 config 文件中的 address 和 master 两项参数,IP 与当前及其的保持一致,端口号为 2017),然后使用一个简单的客户 ...

  9. 带CookieContainer进行post

    1.获取CookieContainer ——用户登录 CookieContainer cookie = new CookieContainer(); UserLoginPost("post地 ...

  10. AJAX异步实现简单的瀑布流

    传统瀑布流布局ul-li,需要先设定显示几列,每列是一个li,需要左浮动并指定宽度,li里面的布局也要先布局好,主要是要定宽,高度自动:然后通过ajax异步,从数据库中得到数据,遍历后将数据插入最矮的 ...