并发系统可以有多种并发模型来实现,并发模型指定线程如何协同完成分配给他们的任务。不同的并发模型以不同的方式划分任务,并且线程与线程之间以不同的方式进行通信和协作。
本文中描述的并发模型类似于分布式系统中使用的不同体系结构。在并发系统中,不同的线程彼此通信。在分布式系统中,不同的进程彼此通信(可能在不同的计算机上)。线程和进程在本质上是非常相似的。这就是为什么不同的并发模型通常看起来与不同的分布式系统体系结构相似。
分布式系统在处理网络失效、远程主机或进程宕掉等方面也面临着额外的挑战。但一个并发系统运行在一个大型服务器中有可能也会遇到类似的问题,比如一块 CPU 失效、一块网卡失效或一个磁盘损坏等情况。虽然失败的概率可能较低,但在理论上它仍然可能发生。
由于并发模型与分布式系统体系结构相似,所以它们常常可以互相借鉴。例如,为工作者们(线程)分配作业的模型一般与分布式系统中的负载均衡系统比较相似。同样,它们在日志记录、失效转移、幂等性等错误处理技术上也具有相似性。
1、并行工作者(Parallel worker)
在并行worker模型中,传入的作业会被分配到不同的工作者,下图展示并行工作者模型
在并行工作者模型中,委派者将传入的作业分配给不同的工作者。每个工作者完成整个任务,这些工作者并行运行在不同的线程上,甚至可能不在同一个CPU上。
如果在车厂利用并行工作者模型,那么每一辆车都是由一工人来完成的,这些工人都要有汽车的生产说明书,并且从头到尾完成一辆车的生产。
并行工作者并发模型是Java应用中最常用的一种并发模型(尽管这个情况在改变)。在java.util.concurrent包中的很多并发工具类的目的是为了应用这个模型。在Java企业版的服务器应用中,也可以看到这个模型的踪迹。