同一线程——单线程的横向扩展

同一线程

同一线程是一种并发模型,是将单线程系统扩展为N个单线程系统。结果是N个单线程系统并行运行。
同一线程系统不是一个纯粹的单线程系统,因为它包含多个线程。但是——每个线程都像单线程系统一样运行,因此,术语是同一线程的,而不是单线程的。

为什么单线程的系统

您可能想知道为什么现在会有人设计单线程系统。单线程系统之所以流行,是因为它们的并发模型比多线程系统简单得多。单线程系统不与其他线程共享任何状态(对象/数据)。这使得单线程使用非并发数据结构,并更好地利用CPU和CPU缓存。
不幸的是,单线程系统并没有充分利用现代CPU。现代的CPU通常多2、4、6、8个核,每个核心作为一个单独的CPU。单线程系统只能使用其中一个内核,如下所示:
在这里插入图片描述

同一线程:单线程拓展

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

每个CPU一个线程

同一线程系统通常在计算机的每个CPU上运行一个线程,如果一台计算机包含4个CPU,或者一个CPU有4个核心,那么将运行4个同一线程系统的实例(4个单线程系统)。下图展示了这一原理:
在这里插入图片描述

没有共享状态

同线程系统看起来类似于传统的多线程系统,因为同一个线程系统中有多个线程在运行。但是有一个微妙的区别。
同线程和传统多线程系统之间的区别是同一线程系统中的线程不共享状态,没有线程并发访问的共享内存,没有线程共享数据的并发数据结构等。下图说明了这种差异:
在这里插入图片描述
缺乏共享状态让每个线程表现得像一个单线程系统。然而,由于同一线程系统可以包含多个线程,但它不是真正的“单线程系统”。没有更好的名字了,我发现称这样的系统为同一线程系统更准确,而不是一个“带有单线程设计的多线程系统”。同一线程更容易说,也更容易理解。
同一线程基本上意味着数据处理保持在同一个线程内,并且在同一个线程系统中没有线程并发地共享数据。有时这也被称为无共享状态并发,或者独立状态并发。

负载分配

显然的,同一线程系统需要在运行的单线程实例之间共享工作分配负载。如果只有一个线程得到任何工作,系统实际上是单线程的。
确切地说,如何在不同的线程上分配负载取决于系统的设计。将在下面的章节中介绍一些。

单线程微服务

如果您的系统包含多个微服务,每个微服务可以在单线程模式下运行。当您将多个单线程微服务部署到同一台机器时,每个微服务可以在单个CPU上运行单个线程。
微服务本质上不共享任何数据,因此微服务是同一线程系统的一个很好的用例。

分片数据的服务

如果您的系统确实需要共享数据,或者至少需要共享一个数据库,您可以对数据库进行分片。分片意味着数据被划分到多个数据库中,数据通常是分开的,所有彼此相关的数据都位于同一个数据库中。例如,所有属于某个“所有者”实体的数据将被插入到同一个数据库中。分片超出了本教程的范围,不过,您必须搜索有关该主题的教程。

线程通信

如果同一线程系统中的线程需要通信,它们通过传递消息来做到这一点。如果线程A想向线程B发送消息,线程A可以通过生成消息(字节序列)来实现这一点。然后线程B可以复制该消息(字节序列)并读取它。当线程B读取消息时,线程B确保线程A不能修改该复制消息消息。一旦复制,消息副本对于线程A是不可访问的。
通过消息传递的线程通信如下所示:
在这里插入图片描述
只要符合你的系统,线程通信可以通过队列、管道、unix套接字、TCP套接字等进行。

简单的并发模型

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

插图

下面是单线程、多线程和同一线程系统的示例,所以你可以更容易地了解它们之间的区别。
第一个图显示了一个单线程系统。
在这里插入图片描述
第二个图显示了一个多线程系统,其中线程共享数据。
在这里插入图片描述
第三个图显示了一个具有两个线程的同线程系统,这些线程具有独立的数据和通信
在这里插入图片描述

Java线程操作

Java的线程操作是一个旨在帮助您更容易地实现独立状态的同一线程系统的开源工具包。线程操作包含启动和停止单个线程的工具,以及在单个线程中实现某种级别的并发性。如果您对同一线程应用程序设计感兴趣,让你看看线程操作可能会很有趣。你可以在我的JAVA线程操作教程中阅读更多关于线程操作的内容。

下一章:并发与并行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值