以下内容转自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并发性和多线程】线程安全及不可变性

    2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/threa ...

  2. 并发基础篇(一): Java 并发性和多线程

    说在前面 介绍文章之前,先给出一个多线程的思维导图, 后续的文章就根据思维导图来一步一步的分析java多线程的知识. 一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多 ...

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

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

  4. 18、Java并发性和多线程-饥饿与公平

    以下内容转自http://ifeve.com/starvation-and-fairness/: 如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为"饥饿& ...

  5. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  6. 17、Java并发性和多线程-避免死锁

    以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按 ...

  7. 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...

  8. java开源线程池_线程池 - Java 并发性和多线程 - UDN开源文档

    线程池 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个 ...

  9. 7、Java并发性和多线程-如何创建并运行线程

    以下内容转自http://ifeve.com/creating-and-starting-java-threads/: Java线程类也是一个object类,它的实例都继承自java.lang.Thr ...

最新文章

  1. TeamViewer 14 on Nvidia Jetson TX2
  2. 装完nvme固态经常蓝屏_微软确认Win10 20H2使用雷电连接固态盘会直接蓝屏死机
  3. jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
  4. C# OpenTK教程 - 1.1 创建窗口
  5. bcd转ascii码 流程图_4-20mA转RS485,MODBUS数据采集模块
  6. windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放...
  7. idea搭建maven工程
  8. 给电视盒子换上第三方桌面
  9. [MAC 苹果电脑] [Linux 系统] ”苹果电脑使用虚拟机安装 Linux Ubuntu系统”教程
  10. 观察者模式及其应用场景
  11. Xcelsius数据源概述
  12. 只有你能听见(Calling you)2
  13. 8个成语接龙首尾相连_四字成语接龙连接8个
  14. AirtestIDE1.2.13的安卓手机设置自动初始化功能
  15. Java 切换win10壁纸
  16. hdu 5148 Cities dp
  17. c 语言计算器带括号优先级,C++结合QT实现带有优先级的计算器功能
  18. matlab 内弹道程序,MATLAB内弹道程序 - 毕设专用!!!
  19. 第2关:求五边形的面积
  20. Jetson nano GPIO的使用

热门文章

  1. 行走在台北·之二·九份(转载)
  2. 算法笔记-经典链表操作案例
  3. 列表渲染 wx:key 的作用、条件渲染 wx:if 与 hidden 的区别
  4. 19.7 主动模式和被动模式 添加监控主机 添加自定义模板 处理图形
  5. Pandas/networkx图分析简单入门
  6. 基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
  7. Python基础学习之 函数
  8. 【预告】腾讯移动分析 MTA 即刻登陆 2017 GMTC 全球移动技术大会
  9. [20180502]PLDEVELOP与存储过程调试.txt
  10. ecshop的Mysql操作类