5.同线程(Same-threading)

● 为什么使用单线程系统?

● 同线程:单线程横向扩展

    ○ 每个CPU一个线程

● 没有共享状态

● 负载分配

    ○ 单线程微服务

    ○ 分片数据服务

● 线程通信

● 更简单的并发模型

● 插图

● Thread Ops for Java工具包


同线程(Same-threading)是一种单线程系统扩展到N个单线程系统的并发模型, 其结果是N个并行运行的单线程系统。

一个同线程的系统并不是一个纯粹的单线程系统,因为它包含多个线程。 但是-每个线程都像单线程系统一样的运行。 因此,我们使用术语“同线程(Same-threading)”而不是“单线程”。

为什么使用单线程系统?

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

不幸的是,单线程系统不能完全利用现代CPU。 现代CPU通常会有2、4、6、8或者更多的内核。 每个内核都可以当成一个单独的CPU使用。 单线程系统只能利用其中一个内核,如下所示:

单线程系统只能利用一个CPU内核

同线程:单线程横向扩展

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

每个CPU一个线程

同线程系统通常在计算机中每个CPU运行1个线程。 如果计算机包含4个CPU或具有4个内核的CPU,则通常会运行4个同线程系统实例的线程(4个单线程系统)。 下图说明了这一原理:

同时运行4个同线程系统实例

没有共享状态

一个同线程的系统,看起来类似于传统的多线程系统,因为一个同线程系统的内部有多个线程在运行。 但是同线程系统与多线程系统之间也有细微的差别。

同线程系统与传统多线程系统之间的区别在于,同线程系统中的线程不共享状态。 没有线程并行访问的共享内存。 没有线程共享数据的并发数据结构等。 下图展示了这种差异:

同线程系统与传统多线程系统之间的区别

缺少共享状态,导致每个线程看上去就像是单线程系统下的行为一样。 但是,由于一个同线程的系统可以包含多个线程-它实际上不是“单线程系统”。 由于缺乏更好的名称,我发现将这样的系统称为同线程系统而不是“具有单线程设计的多线程系统”更为精确。 同线程更容易说,也更容易理解。

从本质上讲,同线程意味着数据处理与其线程处于同一线程内部,并且同线程系统中不会有多个线程同时操作共享数据。 有时,这也被称为无共享状态并发或分离状态并发。

负载分配

显然,一个同线程系统需要在运行的单线程实例之间共享工作负载。 如果只有一个线程完成所有工作,则该系统实际上将是单线程的。

究竟如何在不同线程上分配负载,这取决于系统的设计。 我将在以下各节中介绍一些相关内容。

单线程微服务

如果你的系统包含多个微服务,则每个微服务都可以使用单线程模式运行。 当你将多个单线程微服务部署到同一台计算机上时,每个微服务都可以在单个CPU上运行一个单线程。

微服务本质上不共享任何数据,因此微服务是同线程系统的一个很好的用例。

分片数据服务

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

线程通信

如果一个同线程系统中的线程需要进行通信,则它们可以通过消息传递来进行通信。 如果线程A要向线程B发送消息,则线程A可以通过生成消息(字节序列)来发送消息。 然后,线程B可以复制该消息(字节序列)并读取它。 通过复制消息,线程B确保线程A在读取消息时无法修改消息。 复制后,线程A无法访问该消息副本。

通过消息传递进行的线程通信如下图所示:

通过消息传递进行线程通信

线程通信可以通过队列、管道、Unix套接字、TCP套接字等进行,你可以从中选择一个适应你系统的通信方式。

更简单的并发模型

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

插图

这是单线程、多线程和同线程系统的图示,因此您可以更轻方便了解它们之间的区别。

第一个插图显示了单线程系统。

单线程系统

第二个图显示了一个多线程系统,其中线程之间共享数据。

多线程系统

第三幅图显示了一个具有2个线程,且各自具有独立数据的同线程系统,它们通过相互传递消息进行通信。

同线程系统

Thread Ops for Java工具包

Thread Ops for Java是一个开源工具包,旨在帮助你更轻松地实现分离状态的同线程系统。 线程操作包含用于启动和停止单个线程以及通过单个线程实现某种程度的并发性的工具。 如果你对使用同线程的应用程序设计感兴趣,那么Thread Ops对于你来说 ,看起来可能很有趣。 你可以在我的Thread Ops for Java教程中阅读有关线程操作的更多信息。


译自:Same-threading

Jakob Jenkov

Last update: 2019-12-07

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容