5、Java并发性和多线程-相同线程
以下内容转自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并发性和多线程-相同线程的更多相关文章
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
- Java 并发和多线程(一) Java并发性和多线程介绍[转]
作者:Jakob Jenkov 译者:Simon-SZ 校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...
- Java并发性和多线程
Java并发性和多线程介绍 java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题, ...
- Java并发性和多线程介绍
java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式 ...
- Java高级教程:Java并发性和多线程
Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...
- 15、Java并发性和多线程-线程通讯
以下内容转自http://ifeve.com/thread-signaling/: 线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 例如,线程B可以等待线程 ...
- Java 并发性和多线程
一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...
- 1、Java并发性和多线程-并发性和多线程介绍
以下内容转自http://ifeve.com/java-concurrency-thread/: 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行 ...
- Java并发编程、多线程、线程池…
<实战java高并发程序设计>源码整理https://github.com/petercao/concurrent-programming/blob/master/README.md Ja ...
随机推荐
- yii int
@echo off rem ------------------------------------------------------------- rem Yii command line ini ...
- .net中RSA加密解密
1.产生密钥: private static void CreateKey() { using (RSACryptoServiceProvider rsa = new RSACryptoService ...
- .Net MVC之间的关系以及如何运用
.Net MVC组成部分:视图(views)模型(model)控制器(controller)以及路由(RouteConfig),视图跟模型的数据不进行直接的交互,他们是通过控制器进行视图模型之间的数据 ...
- python中os模块中文帮助
python中os模块中文帮助 python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...
- Android基础TOP5_4:点击按钮更换样式,设置透明度
在res/drawable创建两个样式 点击前/点击后 round: <?xml version="1.0" encoding="utf-8"?> ...
- 【译】x86程序员手册29-第8章 输入输出
Chapter 8 Input/Output 输入/输出 This chapter presents the I/O features of the 80386 from the following ...
- 三维卷积:全景图像Spherical CNNs(Code)
卷积神经网络(CNN)可以很好的处理二维平面图像的问题.然而,对球面图像进行处理需求日益增加.例如,对无人机.机器人.自动驾驶汽车.分子回归问题.全球天气和气候模型的全方位视觉处理问题. 将球形信号的 ...
- CNN结构:可用于时序预测复合的DNN结构-AcGANs、误差编码网络 ENN
前言:模式识别问题 模式函数是一个从问题定义域到模式值域的一个单射. 从简单的贝叶斯方法,到只能支持二分类的原始支持向量机,到十几个类的分类上最好用的随机森林方法,到可以支持ImageNet上海量18 ...
- Redis应用场景[分享]
Redis应用场景[分享] 1.取最新N个数据的操作2.排行榜应用 取TOPN操作3.需要精确设定过期时间的应用4.计数器应用(文章阅读数.评论数)5.Uniq操作,获取某段时间所有数据排重值6.实时 ...
- R语言学习 - 热图绘制heatmap
生成测试数据 绘图首先需要数据.通过生成一堆的向量,转换为矩阵,得到想要的数据. data <- c(1:6, 6:1, 6:1, 1:6, (6:1)/10, (1:6)/10, (1:6)/ ...