Java 并发/多线程教程(五)-相同线程

简介:        本系列译自jakob jenkov的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等,只要是适合你系统的方式都可以。

更简单的并发模型

       每一个运行在它自己线程的系统如果它是单线程的可以使用相同的线程系统去实现。这就意味着相对有共享状态的线程来说内部并发模型变得更加简单了。你不需要担心并发的数据结构以及所有的并发问题。

插图

       下面是单线程、多线程、相同线程的插图,通过这些插图,你可以有个清晰的对比。

首先是单线程系统模型:



其次是多线程模型:



最后是多线程模型:



目录
相关文章
|
8月前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
241 4
|
8月前
|
缓存 安全 Java
如何理解Java中的并发?
Java并发指多任务交替执行,提升资源利用率与响应速度。通过线程实现,涉及线程安全、可见性、原子性等问题,需用synchronized、volatile、线程池及并发工具类解决,是高并发系统开发的关键基础。(238字)
402 5
|
8月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
513 2
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
404 1
|
8月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
379 1
|
9月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
385 0
|
9月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
562 16
|
10月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
8月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
741 0