同线程(Same-threading)是一种并发模型,在这种模型中,一个单线程系统被扩展为 N 个单线程系统。结果是 N 个单线程系统并行运行。

同线程系统并非纯粹的单线程系统,因为它包含多个线程。但是,每个线程像单线程一样运行。因此用同线程这个术语,而不是单线程。

为什么用单线程?

你可能想知道为什么现在还有人会设计单线程系统。单线程系统得到流行,是因为它们的并发模型比多线程系统简单得多。单线程系统不会与其它线程共享任何状态(对象或者数据)。这就让单线程系统能使用非并发数据结构,并更好地利用 CPU 和 CPU 缓存。

不幸的是,单线程系统没有充分利用现代 CPU。现代 CPU 通常带有 2、4、6、8 个以上的核。每个核都可以充当一个单独的 CPU 的功能。而单线程系统只能使用一个核,如下图所示:

5. 同线程 - 图1

同线程:单线程扩展

为了利用 CPU 中的所有核,单线程系统可以被扩展成利用整个计算机。

每个 CPU 一个线程

同线程系统通常是一个线程运行在计算机的每个 CPU 上。如果一台计算机包含 4 个 CPU,或者一个 CPU 有 4 个核,那么它运行同线程系统的 4 个实例(4 个单线程系统)是正常的。下图展示这一原理:

5. 同线程 - 图2

无共享状态

同线程系统看起来类似于传统的多线程系统,因为同线程系统中有多个线程在运行。但是这里有一个微妙的区别。

同线程系统和传统的多线程系统之间的区别是,同线程系统中的线程不共享状态。没有线程同时访问的共享内存,没有线程共享数据的并发数据结构等等。这种区别表示如下图:

5. 同线程 - 图3

由于没有共享状态,所以就让每个线程的行为跟单线程系统一样。不过,由于同线程系统可以包含多个单线程,所以它并不是真正的单线程系统。由于没有更好的名字,我发现把这样的一个系统称为同线程系统,比称为单线程设计的多线程系统,更准确一些。同线程更容易说,更容易理解。

同线程实际上是说,数据处理停留在同一个线程内,并且同线程系统中没有线程同时共享数据。有时,这也称为无共享状态并发,或者分离状态并发。

负载分配

很显然,同线程系统需要在运行的单线程实例之间共享工作负载。如果只有一个线程得到工作,那么该系统实际上是单线程的。

到底如何在不同的线程上分配负载,取决于系统的设计。下面小节我会介绍一些。

单线程微服务

如果系统由多个微服务组成,每个微服务可以按单线程模式运行。当把多个单线程的微服务部署到同一台机器上时,每个微服务可以在一个 CPU 上执行一个线程。

微服务自然是不共享任何数据的,所以微服务是同线程系统的一个不错的使用案例。

切分了数据的服务

如果你的系统确实需要共享数据,或者至少是数据库,那么可以切分数据库。切分(Sharding)是指数据被划分到多个数据库中。数据通常被切分,这样彼此相关的所有数据都被放在同一个数据库中。比如,术语某个所有者实体的所有数据都会被插入到同一个数据库中。不过,数据库切分已经超出了本教程的范围,所以必须自己搜索相关主题的教程。

线程通信

如果在同线程系统中的线程需要通信,可以通过消息传递来实现。如果线程 A 想发送一条消息给线程 B,线程 A 可以通过生成一条消息(字节序列)来实现。然后,线程 B 复制这条消息(字节序列),并读取它。通过复制消息,线程 B 可以确保在线程 B 读取它的时候,线程 A 不会修改这条消息。一旦复制了,消息的副本对于线程 A 来说就是不可访问的。

通过消息传递实现线程通信的示意图如下:

5. 同线程 - 图4

线程通信可以通过队列、管道、unix 套接字、TCP 套接字等实现,只要适合你的系统就可以。

更简单的并发模型

在同线程系统中运行在它自己的线程上的每个系统都可以像单线程一样实现。这就意味着,内部并发模型变得比共享状态的线程简单得多。不用担心并发数据结构以及此类数据结构导致的所有并发问题。

示意图

如下是单线程、多线程和同线程系统的示意图,看这几个示意图可以更轻松了解它们之间的区别。

第一个示意图展示的是单线程系统。

5. 同线程 - 图5

第二个示意图展示的是线程会共享数据的多线程系统。

5. 同线程 - 图6

第三个示意图展示的是同线程系统,其中带有两个线程,两个线程带有分离的数据,线程之间相互通过传递消息来通信。

5. 同线程 - 图7

Thread Ops for Java

Thread Ops for Java 是一个开源工具包,旨在帮助我们更轻松地实现分离状态的同线程系统。Thread Ops 包含用于启动和停止单个线程,以及用单线程实现某种程度的并发的工具。如果对同线程应用程序设计有兴趣,那么看看 Thread Ops 可能会很有趣。在Thread Ops for Java 教程中会读到更多有关 Thread Ops 的知识。