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 并行程序设计模式的更多相关文章

  1. Java 进阶7 并发优化 1 并行程序的设计模式

       本章重点介绍的是基于 Java并行程序开发以及优化的方法,对于多核的 CPU,传统的串行程序已经很好的发回了 CPU性能,此时如果想进一步提高程序的性能,就应该使用多线程并行的方式挖掘 CPU的 ...

  2. Java进阶7并发优化4——JDK并发数据结构

    Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...

  3. Java 进阶7 并发优化 5 并发控制板方法

    Java 进阶7 并发优化 5 并发控制板方法 20131114 前言:          Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...

  4. 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计

    基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...

  5. 【JAVA】高并发优化细节点

    高并发优化细节点: 微服务化 如何发现系统瓶颈?   如何高效利用有限内存: 使用基本类型 使用数组,不用集合 自定义map与数据结构   Integer—>int, Set<Intege ...

  6. Java并行程序设计模式小结

    这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...

  7. 【Java进阶】并发编程

    PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...

  8. 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计

    这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...

  9. 【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式

    这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...

随机推荐

  1. Java线程常用方法汇总

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  2. centos7开启网卡功能

    centos7安装完成后,网卡默认是关闭的,未分配ip地址 解决办法: 1.cd /etc/sysconfig/network-scripts/ 2.ls查看网卡 3.修改该文件 vi ifcfg-e ...

  3. H5 动画:轨迹移动 | H5游戏 推金币

    https://aotu.io/notes/2017/11/06/path-animation/ https://aotu.io/notes/2017/11/06/coindozer/

  4. netty7---自定义序列化接口

    package com.cn.core; import java.nio.ByteOrder; import java.nio.charset.Charset; import java.util.Ar ...

  5. .NET Core + EF 报nuget包不兼容

    错误信息如下: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 NU1107 Microsoft.EntityFrameworkCore 中检测到版本冲突.直接安装/引用 Microsoft.E ...

  6. AVAudioSession(3):定制 Audio Session 的 Category

    本文转自:AVAudioSession(3):定制 Audio Session 的 Category | www.samirchen.com 本文内容主要来源于 Working with Catego ...

  7. 手动加载B120i/B320i阵列卡驱动安装RHEL7.0

    实验设备: Micro server Gen8(B120i) DL360e Gen8(B320i) 目录 一.前期准备... 1 二.加载阵列卡驱动... 11 三.手动分区... 21 四.安装设置 ...

  8. 20135320赵瀚青LINUX第一章读书笔记

    第一章-Linux内核简介 Unix的历史 依旧被认为是最强大和最优秀的系统 由一个失败的操作系统Multics中产生 被移植到PDP-11型机中 由其他组织进一步开发 重写了虚拟内存系统,最终官方版 ...

  9. 解决 maven项目在eclipse中debug时看不到源码问题

    第一步: 第二步:Configurations 里面的source里面是Default.把Defaul删除,选java project ,然后添加自己的项目 第三步:选中,并用命令跑tomcat 这样 ...

  10. 总结的一些json格式和对象/String/Map/List等的互转工具类

    总结的一些json格式和对象/String/Map/List等的互转工具类,有需要的可以看看,需要引入jackson-core-asl-1.7.1.jar.jackson-jaxrs-1.7.1.ja ...