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的代码,便于统一记录. 这章内容分为两个部分: ...
随机推荐
- RPC细节
服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...
- Hibernate与autoCommit
JDBC 的autoCommit属性 对于每一个 JDBC connection,都有一个autoCommit属性,只有执行commit后,该connection中的操作(statement操作)才会 ...
- Python高级语法之:一篇文章了解yield与Generator生成器
Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多 ...
- linux内核第二周
chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语 ...
- params
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Ch06 ...
- .NET数据库编程求索之路--1.引子
转载:[ 夏春涛 email: xchuntao@163.com blog: http://www.cnblogs.com/SummerRain ] 长期做.NET MIS系统开发,打交到最多还是数 ...
- 聊一聊HTML <!DOCTYPE> 标签
一般一个基本html页面的结构,如下代码所示: <html> <head> <title>我是基本的页面结构</title> </head> ...
- 钓鱼WIFI搭建
1.无线网卡 2.KaliLinux操作系统,这里就不用说了,必备的 3.isc-dhcp-server服务器.安装好KaliLinux后只需要apt-get update 然后apt-get i ...
- 记jsp判断
empty:表示空字符串,null,空数组,空集合. ! empty:表示非空字符串,非null,非空数组,非空集合.
- [WCF安全3]使用wsHttpBinding构建基于SSL与UserName授权的WCF应用程序
上一篇文章中介绍了如何使用wsHttpBinding构建UserName授权的WCF应用程序,本文将为您介绍如何使用wsHttpBinding构建基于SSL的UserName安全授权的WCF应用程序. ...