以下内容转自http://tutorials.jenkov.com/java-concurrency/same-threading.html(使用谷歌翻译):

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

同一个线程系统不是一个纯粹的单线程系统,因为它包含多个线程。但是,每个线程都像单线程系统一样运行。

为什么是单线程系统?

你可能会想知道为什么有人今天会设计单线程系统。单线程系统得到普及,因为它们的并发模型比多线程系统简单得多。单线程系统不与其他线程共享任何数据。这使得单线程可以使用非并发数据结构,并更好地利用CPU和CPU缓存。

不幸的是,单线程系统不能充分利用现代CPU。现代CPU通常带有2个或4个以上的内核。每个核心都可以作为一个单独的CPU。单线程系统只能使用其中一个核心,如下所示:

相同线程,单线程缩放

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

每个CPU一个线程

相同线程的系统通常在计算机中每个CPU运行一个线程。如果计算机包含4个CPU或4个内核的CPU,则运行4个同一线程系统(4个单线程系统)的实例是正常的。下图显示了这一原则:

没有共享状态

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

同线程和多线程系统之间的区别在于同一线程系统中的线程不共享状态。没有共享内存,线程同时访问。没有并发数据结构等,线程共享数据。这个区别如下所示:

缺少共享状态是每个线程如果是单线程系统的行为。然而,由于同一线程系统可以包含多个线程,因此它不是真正的“单线程系统”。由于缺乏一个更好的名字,我发现更精确地称这个系统是一个相同的线程系统,而不是一个“单线程设计的多线程系统”。相同线程更容易说明,更容易理解。

相同线程基本上意味着数据处理保持在同一个线程内,并且同一线程系统中的线程不会同时共享数据。

负荷分配

显然,同一线程系统需要共享运行的单线程实例之间的工作负载。如果没有,只有一个实例将获得任何工作,并且该系统实际上将是单线程的。

正确分配负载在不同实例上的方式取决于系统的设计。下面我将介绍几个。

单线程微服务器

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

微服务不会自然地共享任何数据,所以微服务是同一线程系统的好例子。

带有分片数据的服务

如果你的系统实际上需要共享数据,或至少是数据库,则可以分割数据库。分片表示数据在多个数据库之间分配。数据通常被分割,使得彼此相关的所有数据位于同一数据库中。例如,属于某个“所有者”实体的所有数据将被插入同一数据库。分片不在本教程的范围之内,因此你将不得不搜索有关该主题的教程。

线程通信

如果同一线程中的线程需要进行通信,则通过消息传递来实现。想要向线程A发送消息的线程可以通过生成消息(字节序列)来实现。线程B可以复制该消息(字节序列)并读取它。通过复制消息线程B确保线程A在线程B读取时线程A无法修改消息。一旦它被复制,它是不可变的线程A.

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

线程通信可以通过队列,管道,unix套接字,TCP套接字等进行。无论什么只要适合你的系统即可。

更简单的并发模型

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

插图

以下是单线程,多线程和同线程系统的图示,因此你可以更容易地了解它们之间的区别。

第一个例子显示了一个单线程系统。

第二个例子显示了线程共享数据的多线程系统。

第三个例子显示了一个具有2个线程的同一线程系统,它们分开数据,通过传递消息来进行通信。

5、Java并发性和多线程-相同线程的更多相关文章

  1. java 并发性和多线程 -- 读感 (一 线程的基本概念部分)

    1.目录略览      线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程.      线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...

  2. Java 并发和多线程(一) Java并发性和多线程介绍[转]

    作者:Jakob Jenkov 译者:Simon-SZ  校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...

  3. Java并发性和多线程

    Java并发性和多线程介绍   java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题, ...

  4. Java并发性和多线程介绍

    java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式 ...

  5. Java高级教程:Java并发性和多线程

    Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...

  6. 15、Java并发性和多线程-线程通讯

    以下内容转自http://ifeve.com/thread-signaling/: 线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 例如,线程B可以等待线程 ...

  7. Java 并发性和多线程

    一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...

  8. 1、Java并发性和多线程-并发性和多线程介绍

    以下内容转自http://ifeve.com/java-concurrency-thread/: 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行 ...

  9. Java并发编程、多线程、线程池…

    <实战java高并发程序设计>源码整理https://github.com/petercao/concurrent-programming/blob/master/README.md Ja ...

随机推荐

  1. spring简介及常用术语

    1.引入 在开发应用时常会遇到如下问题: 1)代码耦合性高: 2)对象之间依赖关系处理繁琐: 3)事务控制繁琐: 2.Spring简介 1)Spring概述 什么是Spring: ①Spring是一个 ...

  2. 【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  3. [ CodeForces 1059 D ] Nature Reserve

    \(\\\) \(Description\) 你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足: 能够覆盖所有的给出点 与\(x\)轴相切 现在需要你确 ...

  4. 图标文件ico制作以及使用说明

    今天说一个图标文件——ico.我们在pc端浏览网页的时候网页栏那块都会显示一个本网站特有的图片,就是我们说的ico了.示例:<link href="image/favicon.ico& ...

  5. esp8266 SOC方案经过半年沉淀之后再度重启

    我发誓这是最后一次玩esp8266,该脱坑了...... 以前看不懂的教程 http://club.gizwits.com/thread-6447-1-1.html 2018教程 http://clu ...

  6. microPython 的逗比报错的问题

    今天搞了一天,发现了各种问题,首先最终的解决办法就是重现刷固件!!!! 重刷固件就需要清除flash! cd C:\Users\sansong\AppData\Local\Programs\Pytho ...

  7. Appium Python API 汇总(中文版)

    网络搜集而来,留着备用,方便自己也方便他人.感谢总结的人! 1.contexts contexts(self): Returns the contexts within the current ses ...

  8. Farseer.net轻量级开源框架 中级篇:数据绑定

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂 下一篇:Farseer.net轻量级开源框架 中级篇: ...

  9. jquery.ajax之beforeSend方法使用介绍

    常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者“内容加载中..”,用来告知用户正在请求数据.这个就可以用beforeSend方法来实现. 下载demo:a ...

  10. HDU_1175_连连看

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大意:连连看规则,只能转两次弯,先输入矩阵0表示没有棋子,正整数表示不同的棋子,然后询问,输入两点坐 ...