• 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         表示的是客户端请求的队列,由ClientThreadServerThread维护,ClientThread负责不断的发起请求,将请求放到请求队列中;ServerThread根据自身的状态,在有能力处理请求的时候,从RequestQueue中取出请求,进行处理。

             ClientThread             客户端进程

             ServerThread            服务器进程

             当客户端请求的数量超过了服务器的即时处理能力的时候,RequestQueue充当的是中间缓存的角色,存放未处理的请求,保证客户端请求不会丢失,也保护服务器线程不会受到大量并发的请求,而导致计算机资源不足。

             这种并发模式在一定程度上是可以缓解系统的压力,他可以将系统的负载咋时间轴尚均匀的分布,降低系统的瞬时负载,对于提高系统的抗压力和稳定性有一定的帮助。

    2.不变模式

             在并行软件开发模式中,同步操作时必不可少的。多线程对同一个对象进行读写操作的时候,为了保证数据的一致性和正确性,有必要对对象进行同步操作,但是同步操作对于系统的性能有着十分大的损耗。为了尽可能的去除这些同步操作,提高并行程序的性能,可以使用一种不可以改变的对象,依靠对象的不可改变性,可以确保在没有同步操作的多线程环境中依然是中保持内部状态的一致性和正确性。这就是不变模式。

             不变模式是多线程友好的,他的核心思想就是:一旦一个对象被创建,则他的内部状态将永远无法被改变。所以没有一个线程是可以修改对象的内容和数据,同时他自身的内部状态也是无法改变的。这样的话,对于多线程程序就没有必要实现同步机制。

             同时不变模式和只读属性是有一定的分别的。不变某事比只读属性具有更强的一致性和不变性。对于只读属性的对象而言,对象背身是不会被其他的线程修改,但是对象的自身状态确实可以自行修改的。比如:一个对象的存活时间是只读的,任何一个第三方线程都不可能去修改这个属性,但是这个属性石一个自身可以变化的属性。

             所以在一定程度上是可以这样理解不变模式的:不变模式不是尝试着去解决问题,而是通过回避问题的角度去考虑,有些地方通过不变模式,是不需要同步的,这样就会节省很大的开销,提高并行程序的效率。

    3生产者和消费者模式

             生产者线程和消费者线程不会直接通信,而是通过一个缓冲区进行通信,试下多线程之间数据的共享。同时通过缓冲区,可以缓解生产者和消费者之间的性能差。其核心组件式内存缓冲区。参与的角色设计:

             生产者     提交用户请求,提取用户任务,并且装入内存缓冲区;

             消费者     在内存缓冲区中提取并且处理任务;

             内存缓冲区   缓存生产者提交的任务或者数据,供消费者使用;

             任务         生产者想消费者提供的数据结构

             Main        使用生产者和消费者的客户端

             生产者-消费者模式能够很好的对生产者线程和消费者线程进行解耦,优化了系统的整体结构。同时由于缓冲区的作用,允许生产者线程和消费者线程存在执行上的性能差异,从一定程度上缓解了性能瓶颈对于系统性能的影响。

    Tengfei Yang

    于广州中山大学图书馆

    20131114

     

  • 相关阅读:
    WebStorm 简单部署服务器进行测试操作
    springbootstarterthymeleaf 避坑指南
    在linux云服务器上运行Jar文件
    springBoot整合MyBatise及简单应用
    关闭tomcat端口号
    基本项目框架搭建 sqlserver druid配置
    java springboot+maven发送邮件
    SQLServer 的存储过程与java交互
    Java 读写锁的实现
    SpringBoot 异步线程简单三种样式
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3438853.html
Copyright © 2020-2023  润新知