并行程序设计模式的介绍
- 并行程序设计模式的介绍
- Future模式
- Master-Worker模式
- Guard Suspension保护性暂挂模式
- Immutable Object不变模式
- Two-phase Termination两阶段终止模式
- Producer-Consumer生产者-消费者模式
- Active Object主动对象模式
- Thread Pool线程池模式
- Thread Specific Storage线程特有存储模式
- Thread Confinement串行线程封闭模式
- Pipeline流水线模式
- Half-syncHalf-async半同步半异步模式
Future模式
Future模式有点类似商品订单,是将异步请求和代理模式联合的模型产物
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。
角色 | 作用 |
Main | 启动系统,调用Client发出请求; |
Client | 返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData; |
Data | 返回数据的接口; |
FutureData | Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData; |
RealData | 真实数据,构造比较慢。 |
Master-Worker模式
系统由两类进程协同工作:Master进程和Work进程。Master近成负责接收和分配工作,work进程负责处理子任务。当各个Worker进程将子任务处理完成后,将结果返回给Master进程,有Master进程归纳和汇总,从而得到系统的最终结果。
Master-worker模式的好处模式的好处,他能够将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。
Master-Worker模式是一种使用多线程进行数据处理的结构,多个Worker进程协作处理用户请求,Master进程负责维护Worker进程,并整合最终处理结果。
角色 | 作用 |
Worker | 用于实际处理一个任务; |
Master | 任务的分配和最终结果的合成; |
Main | 启动程序,调度开启Master。 |
Guard Suspension保护性暂挂模式
Guarded Suspension模式意为保护暂停,核心思想是当服务进程准备好时,才提供服务。当服务器在很短时间内承受大量的客户端请求,客户端请求的数量可能超过服务器本身的即使处理能力,所以让客户端一个一个排队,由服务端程序一个接一个处理。
Guarded Suspension模式在一定程度上环节系统的压力,可以将系统的负载在时间轴上均匀的分配,使用该模式后,可以有效降低系统的瞬时负载,可以提高系统的抗压力和稳定性有一定帮助。
角色 | 作用 |
Request | 表示客户端请求 |
RequestQueue | 用于保存客户端请求队列 |
ClientThread | 客户端进程 |
ServerThread | 服务器进程 |
Immutable Object不变模式
不变模式天生就是多线程友好,它的核心思想是,一个对象一旦创建,它的内部状态将永远不会改变,所有,没有一个县城可以修改其内部状态和数据,同时,其内部状态也绝不会自行发生改变。
不变模式和只读模式的区别:不变模式具有更强的一致性和不变性,对只读属性的对象而言,对象不能被其他线程修改,但是对象的自身状态却可能自行修改。
应用场景:对象创建后,其内部状态和数据不在发生任何变化。或者对象需要被共享、被多线程频繁访问。
Two-phase Termination两阶段终止模式
在多线程中,线程会因为各种原因停止,但这并不简单。首先Java没有提供直接的API用于停止线程。而且停止线程的时候还有一些问题需要处理,比如线程的信息保存问题。所以需要有程序优雅的停止线程。
解决这个问题分为两个时间短,第一个时间段是准备阶段,这个阶段通知目标线程,使得线程开始进行相关处理。第二时间段是执行阶段,检查准备阶段设置的线程停止标志和信号,在次基础上决定线程停止的时机,并进行适当的“清理”操作。
用一个ImmutableObject类来存储不可变值的信息,改参与者不对外暴露任何可以修改其状态的方法,另一个类负责维护上一个类所创建信息的实体的变更,党相应的现实实体状态变更是,改参与者负责生成新的ImmutableObject,以反应新的状态。
Producer-Consumer生产者-消费者模式
生产者-消费者模式中,生产者线程负责提交用户请求,消费者线程则负责集体处理生产者提交的任务。生产者和消费者之间通过共享共享内存缓冲区进行通信。
角色 | 作用 |
生产者 | 用于提交用户请求,提取用户任务,并装入内存缓冲区 |
消费者 | 在内存缓冲区中提取并处理任务 |
内存缓冲去 | 缓存生产者提交的任务或数据,供消费者使用 |
任务 | 生产者向内存缓冲区提交的数据结构 |
Main | 使用生产者和消费者的客户端 |
Active Object主动对象模式
有的时候需要线程中的方法与调用分离,即在线程外用方法调用线程内方法,可是线程内的方法不能被直接调用,所以需要这里的主动对象模式处理这个问题。
Thread Pool(线程池)模式
一个系统中的线程相对与其所要处理的任务而言,总有一种非常有限的资源,线程不仅在其执行任务是需要消耗CPU时间和内存等资源,线程对象本身以及线程所需的调用栈也占用内存,并且Java中创建一个线程往往意味着JVM会创建相应的依赖与宿主机操作系统的本地线程。所以,为每个或者每一批任务创建一个线程以对其进行执行,通常是一种奢侈而不现实的事情。
Thread Specific Storage(线程特有存储)模式
多线程相关问题,引入线程安全、死锁等对根就地是多变成共享变量导致的。如果解决了共享变量的问题,就可以让一部分无需共享变量的线程没有线程安全的问题。
Thread Confinement(串行线程封闭)模式
如果并发任务的执行涉及某个非线程安全对象,而很多时候我们又不希望因此而引入锁。
Pipeline(流水线)模式
有时一些线程的步奏比较冗长,而且由于每个阶段的结果与下阶段的执行有关系,又不能分开
Half-sync/Half-async(半同步/半异步)模式
同步和异步各有各的优势,有没有一个方法,能够既保持了同步编程的简单性,又充分发挥异步编程在提高系统并发性方面的优势。