Java进阶7 并发优化2 并行程序设计模式
Java进阶7 并发优化2 并行程序设计模式20131114
1.Master-worker模式
前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式。下面介绍的是Master-Worker模式。
这个模式也是经常使用的并发模式之一,核心思想就是系统有两类线程协同工作:Master线程和Worker线程。Master线程负责接收和分配任务,Worker线程负责处理这些子任务。当每一个worker线程处理完成之后,将结果返回给Master线程,有Master线程负责整合结果。
他的好处在于能够将一个大的任务拆分成为若干个小任务,并且能够并行执行,从而提高系统的吞吐量。而对于系统请求client者来说Master分配任务会立即返回,并不会等待系统将所有的任务处理完成之后再返回,其处理过程是异步的,因此Client不会出现等待的现象。
Master-Worker模式的角色:
Worker 用于实际处理一个任务
Master 用于任务的分配的最终结果的合成
Main 启动系统,调度开启Master线程。
2.Guarded-suspension模式的结构
Guarded-Suspension意思是保护暂停,核心思想是仅当服务进程准备好的时候,才提供服务。比如服务器可能会在很短的时间内承受大量的客户端请求,当客户端请求的书量超出了服务器本身的即时处理能力,而且服务器不能够丢弃任何一个请求的,此时最佳的处理方案莫过于让客户端请求进行排队,由于服务器只可以一个一个的处理请求。这样,请求就不会被丢弃,同时也避免了因为过多的客户端请求而导致服务器崩溃。
Guarded Suspension 模式的结构:
Request 表示客户端的请求,用于封装客户端的请求
RequestQueue 表示的是客户端请求的队列,由ClientThread和ServerThread维护,ClientThread负责不断的发起请求,将请求放到请求队列中;ServerThread根据自身的状态,在有能力处理请求的时候,从RequestQueue中取出请求,进行处理。
ClientThread 客户端进程
ServerThread 服务器进程
当客户端请求的数量超过了服务器的即时处理能力的时候,RequestQueue充当的是中间缓存的角色,存放未处理的请求,保证客户端请求不会丢失,也保护服务器线程不会受到大量并发的请求,而导致计算机资源不足。
这种并发模式在一定程度上是可以缓解系统的压力,他可以将系统的负载咋时间轴尚均匀的分布,降低系统的瞬时负载,对于提高系统的抗压力和稳定性有一定的帮助。
2.不变模式
在并行软件开发模式中,同步操作时必不可少的。多线程对同一个对象进行读写操作的时候,为了保证数据的一致性和正确性,有必要对对象进行同步操作,但是同步操作对于系统的性能有着十分大的损耗。为了尽可能的去除这些同步操作,提高并行程序的性能,可以使用一种不可以改变的对象,依靠对象的不可改变性,可以确保在没有同步操作的多线程环境中依然是中保持内部状态的一致性和正确性。这就是不变模式。
不变模式是多线程友好的,他的核心思想就是:一旦一个对象被创建,则他的内部状态将永远无法被改变。所以没有一个线程是可以修改对象的内容和数据,同时他自身的内部状态也是无法改变的。这样的话,对于多线程程序就没有必要实现同步机制。
同时不变模式和只读属性是有一定的分别的。不变某事比只读属性具有更强的一致性和不变性。对于只读属性的对象而言,对象背身是不会被其他的线程修改,但是对象的自身状态确实可以自行修改的。比如:一个对象的存活时间是只读的,任何一个第三方线程都不可能去修改这个属性,但是这个属性石一个自身可以变化的属性。
所以在一定程度上是可以这样理解不变模式的:不变模式不是尝试着去解决问题,而是通过回避问题的角度去考虑,有些地方通过不变模式,是不需要同步的,这样就会节省很大的开销,提高并行程序的效率。
3生产者和消费者模式
生产者线程和消费者线程不会直接通信,而是通过一个缓冲区进行通信,试下多线程之间数据的共享。同时通过缓冲区,可以缓解生产者和消费者之间的性能差。其核心组件式内存缓冲区。参与的角色设计:
生产者 提交用户请求,提取用户任务,并且装入内存缓冲区;
消费者 在内存缓冲区中提取并且处理任务;
内存缓冲区 缓存生产者提交的任务或者数据,供消费者使用;
任务 生产者想消费者提供的数据结构
Main 使用生产者和消费者的客户端
生产者-消费者模式能够很好的对生产者线程和消费者线程进行解耦,优化了系统的整体结构。同时由于缓冲区的作用,允许生产者线程和消费者线程存在执行上的性能差异,从一定程度上缓解了性能瓶颈对于系统性能的影响。
Tengfei Yang
于广州中山大学图书馆
20131114
Java进阶7 并发优化2 并行程序设计模式的更多相关文章
- Java 进阶7 并发优化 1 并行程序的设计模式
本章重点介绍的是基于 Java并行程序开发以及优化的方法,对于多核的 CPU,传统的串行程序已经很好的发回了 CPU性能,此时如果想进一步提高程序的性能,就应该使用多线程并行的方式挖掘 CPU的 ...
- Java进阶7并发优化4——JDK并发数据结构
Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...
- Java 进阶7 并发优化 5 并发控制板方法
Java 进阶7 并发优化 5 并发控制板方法 20131114 前言: Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...
- 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...
- 【JAVA】高并发优化细节点
高并发优化细节点: 微服务化 如何发现系统瓶颈? 如何高效利用有限内存: 使用基本类型 使用数组,不用集合 自定义map与数据结构 Integer—>int, Set<Intege ...
- Java并行程序设计模式小结
这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...
- 【Java进阶】并发编程
PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...
- 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...
- 【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式
这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...
随机推荐
- Druid学习之路 (二)Druid架构
作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9608812.html 转载请注明出处 Druid架构 Druid原本就设计为一个容易操作的面向云的多进 ...
- oracle安装完成后目录中不论有没有tnsnames.ora和listener.ora文件 PLSQL都能连上的问题解决方法
今天遇到这个问题了,发现listener.ora文件和tnsnames.ora文件在Net Work文件夹下没有,正常情况下安装完oracle或者是oracle Client是会有的,但是在Net M ...
- AVAudioSession(1):iOS Audio Session 概览
本文转自:AVAudioSession(1):iOS Audio Session 概览 | www.samirchen.com 本文内容主要来源于 Audio Session Programming ...
- RocEDU.阅读.写作《苏菲的世界》书摘
我们在成长的过程当中,似乎失去了对这世界的好奇心.也正因此,我们丧失了某种极为重要的能力(这也是一种哲学家们想要使人们恢复的能力).因为,在我们内心的某处,有某个声音告诉我们:生命是一种很庞大的.神秘 ...
- RocEDU.阅读.写作《霍乱时期的爱情》书摘(三)
暮年的岁月不是奔涌向前的激流,而是一个无底的地下水池,记忆从这里慢慢流走. 那是对人生,爱情,老年和死亡的思考:这些想法曾无数次像夜间的鸟儿一般扑扇着翅膀掠过她的头顶,可每当她想抓住它们时,它们就惊飞 ...
- 20145322第九周JAVA程序设计基础学习总结
20145322第九周JAVA程序设计基础学习总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的标准规范.它定义一组标准类与接口,应用程序需要 ...
- 轻谈Normalize.css
Normalize.css 是 * ? Normalize.css只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset , Normali ...
- react-native中使用自定义的字体图标iconfont
iconfont图标库下载 可在 http://www.iconfont.cn 下载 下载完成后的目录中有字体文件: iconfont.ttf 拷贝字体文件 Android: 在 Android/ap ...
- Jquery12 Ajax
学习要点: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 Ajax ...
- c++之单例模式
1 本篇主要讨论下多线程下的单例模式实现: 首先是 double check 实现方式: 这种模式可以满足多线程环境下,只产生一个实例. template<typename T> clas ...