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等,只要是适合你系统的方式都可以。

更简单的并发模型

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

插图

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

首先是单线程系统模型:



其次是多线程模型:



最后是多线程模型:



目录
相关文章
|
6天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
144 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
26天前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
3天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
32 20
|
6天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
9天前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
28天前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
47 4
|
28天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
52 1
|
1月前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
28天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
38 0
|
6月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
166 1

热门文章

最新文章