类单线程是这样一种并发模型,它把一个单线程系统扩展到N个单线程系统,结果是N个单线程系统并行运行。
类单线程系统不是纯粹的单线程系统,因为它包含多个线程。但是,每个线程都像单线程系统一样运行。因此称之为类单线程而不是单线程。
为什么要用单线程系统?
你可能好奇,为什么时至今日还有人会设计单线程系统。单线程系统之所以受欢迎,是因为其并发模型比多线程系统简单得多。单线程系统不与其他线程共享任何状态(对象/数据)。这使得单线程能够使用非并发数据结构,并更好地利用CPU和CPU缓存。
类单线程:单线程的扩展
为了充分利用CPU中的所有核心,可以扩展单线程系统来利用整个计算机。
每个CPU一个线程
无共享状态
类单线程系统看起来类似于传统的多线程系统,因为类单线程系统中有多个线程在运行。但两者有一个微妙的区别。
类单线程基本上意味着数据处理停留在同一个线程内,并且类单线程系统中没有线程同时共享数据。有时这也被称为无共享状态并发,或分离状态并发。
负载分配
显然,类单线程系统需要在运行的单线程实例之间共享工作负载。如果只有一个线程分配了工作,系统实际上是单线程的。
如何在线程之间分配负载取决于系统的设计。我将在下面的章节中介绍一些内容。
单线程微服务
如果系统由多个微服务组成,则每个微服务都可以在单线程模式下运行。当你在同一台计算机上部署多个单线程微服务时,每个微服务可以在单独的CPU上运行一个线程。
微服务本质上不共享任何数据,因此对于类单线程系统来说,微服务是一个很好的用例。
分片数据服务
如果你的系统确实需要共享数据,或者至少需要一个数据库,那么你可以对数据库进行分片。分片意味着数据被分成多个数据库。数据通常被分割,以便所有相互关联的数据都位于同一个数据库中。例如,所有属于某个“所有者”实体的数据都将插入到同一个数据库中。不过,切分数据超出了本教程的范围,因此你需要自己搜索有关该主题的教程。
线程通信
更简单的并发模型
在类单线程系统中,每个运行在其自身线程中的系统都可以像单线程一样实现。这意味着,与线程共享状态相比,内部并发模型变得简单得多。你不必再担心并发数据结构以及此类数据结构可能导致的所有并发问题。
示意图
Thread Ops for Java
Thread Ops for Java是一个开源工具包,旨在帮助你更容易地实现分离状态的类单线程系统。它包含启动和停止单个线程的工具,以及使用单个线程实现某种程度的并发性。如果你对使用类单线程来设计应用程序感兴趣,那么你可能会对Thread Ops感兴趣。