Java 并发/多线程教程(五)-相同线程
本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!
相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统。这样的结果就是多个单线程并行运行。
为什么是单线程系统?
你也许会感到好奇,为什么当今还有人设计单线程系统。单线程系统之所以这么普及,是因为单线程系统相对于多线程并发系统更为简单。单线程系统不需要与其他线程共享任何数据。这就使得单线程系统可以使用非并发的数据结构,可以更好的利用CPU和CPU缓存。
不幸的是,单线程并发系统并不充分利用当今计算机的CPU。现在的计算机一般有2,4或者更多的核,每个核的作用与单个CPU一样,一个单线程并发系统只能利这些核中的一个,单线程系统的结构图如下:
相同的线程、单线程的扩展
为了更为充分的利用CPU,单线程系统可以进行扩展以至于能利用整个计算机资源。
每个CPU一个线程
通常情况下,相同线程只在一个CPU上运行一个线程。如果计算机有4个CPU或是这个CPU拥有4个核,然后他会在4个CPU或是在4个核上运行4个线程实例。其结构图如下 :
无共享状态
单线程系统看起来与多线程系统非常相似。因为,一个单线程系统有多个线程同时运行在系统内部。但是它与多线程系统有一点点的不同。
单线程系统与多线程系统的不同之处在于:在单线程系统中,线程间不共享状态。这里没有线程并发的访问共享内存。没有共享数据结构等。它们的不同之处如下图:
缺少共享状态,使得每个线程的行为是一个单线程系统,然而,因为一个单线程系统可以包括多个线程,所以它并不是真正意义上的单线程。因此,我认为将这种模型称之为相同线程的系统更为准确些。而不是叫单线程设计模式的多线程系统,相同的线程更容易理解。
负载分配
显然,一个单线程系统需要将他们的工作负载到单线程远行的实例上。如果不这样做,将会只有一个实例完成所有的工作。那么其实这就是一个单线程。
如何准确分配负载到不同的实例上,这取决于你的系统是如何设计的。
单线程微服务
如果你的系统是由多个微服务组成的。每个微服务是以一个单线程模型运行。当你在同一台机子上发布多个单线程微服务,每个微服务可以在一个CPU上运行一个单线程。
自然而然,微服务不共享任何数据。因此微服务是一个单线程很好的例子。
分片数据服务
如果你的系统确实需要共享数据,或是数据库中最新的数据,你可以对数据库进行分片,分片意味你把一个数据库划分为多个数据库。这些数据是有代表性的分离,例如:属于owner的数据会被插入到相同的数据库。
线程通信
如果相同线程里的线程需要通信,它们需要传递消息。线程A想通过通用的消息(a byte sequence)方式传递到线程B,线程B可以复制这个消息并且进行读取。通过复制这个消息,线程B要确保它在读取这个消息的时候线程A不对其进行修改。
线程间消息通信的结构图如下:
线程间的通信可用队列、socket等,只要是适合你系统的方式都可以。
更简单的并发模型
每一个运行在它自己线程的系统如果它是单线程的可以使用相同的线程系统去实现。这就意味着相对有共享状态的线程来说内部并发模型变得更加简单了。你不需要担心并发的数据结构以及所有的并发问题。
插图
下面是单线程、多线程、相同线程的插图,通过这些插图,你可以有个清晰的对比。
首先是单线程系统模型:
其次是多线程模型:
最后是多线程模型:
Java 并发/多线程教程(五)-相同线程相关推荐
- Java 并发/多线程教程(四)-并发模型
本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 并发系统可以有多 ...
- Java并发/多线程教程——1
本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!在早期,计算机只有一个CPU,同一时刻只能执行一个程序,后来有了多任务的说法,多任务是 ...
- java线程知乎_全网独家!知乎20K点赞的Java并发多线程笔记,简直堪称神仙级文档...
有很多小伙伴都问过我,头条号里的关于java多线程的文章有pdf版本吗?我其实很想弄pdf,但是前段时间一直没时间去折腾,我把每个Java并发编程核心技术的都整理成了一个又一个的文档.昨天也是终于全部 ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
- java并发多线程面试_Java多线程并发面试问答
java并发多线程面试 Today we will go through Java Multithreading Interview Questions and Answers. We will al ...
- [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...
[Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronize ...
- Java并发编程|第二篇:线程生命周期
文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...
- 《Java并发编程的艺术》——线程(笔记)
文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...
最新文章
- 得到Android设备的唯一id
- Mybatis的一对一查询以及延迟加载
- [转]白话阿里巴巴Java开发手册高级篇
- Android之Windows下搭建React Native Android开发环境(差不多搞了一天)
- 程序员面试金典 - 面试题 01.03. URL化(字符串)
- arm9 安装java_QT5.7 AM1808 ARM9的交叉编译
- FastDFS(提升磁盘IO性能的几个技巧 FastDFS 5.04之IO读事件)
- centos环境下安装redis
- ssh客户端_Termius for Mac(SSH客户端) v6.3.0
- 拒绝捞回中的效果评估与策略二次调用
- 在.Net中json应用测试整理
- haproxy服务启动命令_HaProxy的安装配置和常用命令介绍
- carmaker的弱智算法
- 利用Aria2和Pandown实现科学下载百度云资源
- 软件测试面试题--银行面试
- JEECG常见问题大全
- Ubuntu 向日葵被远控无法显示图形化界面的解决方案
- Q2海外收入首次过半 欢聚借Bigo能否再造一个“虎牙”?
- git命令出现fatal: Unable to create 'xxx/.git/index:File exists.问题
- 计算机软考难吗?如何通过?