《Java 多线程实战系列》- 01 基本概念与底层原理

简介: 《Java 多线程实战系列》- 01 基本概念与底层原理

多线程实战系列

第一章 基本概念与底层原理

01 串行、并行、并发

欢迎大家来学习「多线程编程」课程,本章节呢我们主要会讲解多线程编程的一些相关基本概念,以及它的底层实现原理。本小节主要讲述的是串行、并行以及并发,这三个基本的概念。

本节的目标呢,主要是有两个:

第一,了解「串行、并行、并发」这三个概念的一些含义;

第二,是本小节的重点,要对并行、并发这两个概念有一个清晰的认识,了解他们之间的区别。

串行

好的,那我们先来看一下第一个概念,串行(Sequential)

它的定义,简单的来讲呢,就是在同一时间里,我们只能做一件事情,而且是要按照顺序依次进行的。

那在程序上来看呢,就是后面的代码段,必须要等到前面的代码段执行完毕之后,才能执行。

咱们来看一个生活中常见的例子,我们现在有钱了,买了套房子,马上就要开始装修了,但是呢我们钱不多了,现在的经费有限,只请得起一个师傅来装修房屋。

他一共有三件任务,第一项任务是拆墙,第二项任务是安装水电线,第三项任务是刷墙和铺地板。

跟师傅沟通之后,得知拆墙得用 2 天,安装水电线要 1 天,刷墙和铺地板也要 3 天。你看,如果这一个师傅从头到尾装修下来后,总需要耗费的时间就是 2 + 1 + 3 = 6 天,一共要花费 6 天的时间才能完成装修房子的整个任务。

因此呢,我们去算它的总耗时,就是每一个任务完成时间,进行一个累加,它们的和就是它的总耗时。

并行

接着,我们来看第二个概念,并行(Parallelism)。

它的定义,简单的来讲呢,就是在同一时刻,很多个任务可以同时开始进行,而且这些任务之间彼此没有依赖关系。

继续用房子装修作为案例。假设我们又有钱了,现在的经费非常充足,咱可以请三个师傅。

每个师傅可以负责他自己所对应的那个任务,比如王师傅他只需要是拆墙,李师傅只需要安装水电线,陈师傅只需要去刷墙和铺地板。此时你看,在条件允许的情况下,他们三个师傅就可以同时开干了。

这时候,我们再来看一下图,可以很清楚地看到,整个装修房屋的工程呢,只需要三天时间就可以完成了。

因此,在装修房屋的整个任务中,咱们采用了并行这个方式呢,可以让整个任务的总耗时更少,而实质上你可以发现,它是取决于耗时最长的内建子任务所需要的时间。

哪个任务的耗时最长呢?在图中可以看出,是刷墙和铺地板,需要 3 天。

并发

接着,我们来看第二个概念,并发(Concurrency)。

它的定义,也很简单,它是采用的是交替的方式,主要是利用等待某件事情完成的时间,去做其他的事情。

比如,你开始做饭的时候,可以先把米下锅,然后再去洗菜、炒菜,甚至中途还可以按一下洗衣机洗衣服。

继续用房子装修作为案例。此时,我们不小心又变穷了,现在的经费呢又不足了,只请得起一个师傅。

师傅开始干活了,他现在干的第一件事情,是刷墙和铺地板,这个任务的耗时,是三天的时间。要注意,装修的时候,咱刷完墙、铺好地板之后,是不是还得让它风干了才行?假设,刷墙、铺地板要耗费 2 天,全部好之后,最后 1 天就留着让它风干。

那你想,在风干的这个阶段里,咱师傅其实是没活干的,那就可以安排他去安装水电线呀。工作调整后,是不是就可以把风干的这么一天的时间节省下来,去完成了安装水电线的任务。当水电线的安装任务完成后,墙壁和地板的风干也结束了,是不是就在 3 天的时间里,同时把这两个任务都完成了?

接下来,他就可以进行拆墙的任务了,再花费 2 天的时间即可。

因此,整个装修房子的任务,只需要 5 天的时间,因为我们把风干的这一天节省了下来,同时去完成了安装水电线的工作。

并发 & 并行

通过前面的讲解,相信大家对串行、并行、并发这三个基本概念有了一定的了解。

接下来,让我们重点来讲解一下「并行与并发」之间的关系以及区别。

先看第一个图,好比现在只有一个 CPU,它同时面对了 A、B、C 三个任务,在同一时刻,一个 CPU 只能执行同一个任务。

在 CPU 中,首先去执行了任务 A,在执行任务 A 的过程当中,可能会碰到外力的一些阻碍,而导致了任务 A 暂时进入等待。

在等待的过程中,此时 CPU 是空转的,那如果想提高我们 CPU 的利用效率,来多节省点儿时间,该怎么办呢?

在等待任务 A 的过程中,我们可以把 CPU 拿来执行其他任务,比如任务 B。当我们去执行任务 B 的时候,可能也会碰到类似的,需要继续等待的情况。

这时候,也许 A 和 B 都依然是等待的状态,不过没事儿,我们可以继续去完成任务 C。在执行 C 的过程当中呢,我们发现 A 已经就绪了,那 CPU 此时就可以转回头去执行它。

你看,在我们的 CPU 里面,执行任务的时候,其实会不断地进行切换,通过这样的交替、反复的过程去实现更高效地完成任务。

CPU 在执行任务的时候,它的运行速度,实际上是非常非常快的。

从宏观层面上看,人类肉眼是无法感知得到这个切换间隙的,在我们看来,它从未中断过,是一直在执行的。所以,在我们人类看来,这些任务 A、B、C,都是同时就完成了的。

但是在微观上而言,因为在同一时间呢,CPU 只能完成一件任务。任务 A、B、C,实际上就是交替完成的,这就是并发。

但如果我们的资源比较充足,就跟我们前面装修的例子一样,经费充足的情况下,可以同是请三个师傅来开工,那效率一下子就上去了。

对于计算机来说,如果我们有三个 CPU,每个 CPU 都可以投入执行对应的任务。比如第一个 CPU 执行任务 A,第二个 CPU 执行任务 B,第三个 CPU 执行任务 C。

那这三个任务,同时开始执行,那它们的完成时间当然就更快了,这就是并行。

如果说,我们目前仍然只有三个 CPU,但需要处理 10 个任务的话,会发生什么不同吗?

实际上不会,一定要明白一个不变的事实,在同一时间里,一个 CPU 只能完成一件任务。此时,三个 CPU 那也只能有三个任务可以去执行,剩下的七个任务,也是需要进行等待的。

小结

通过前面的小案例,咱们详细讲解了串行、并行、并发等几个概念,相信大家对这些基本概念,都有了一个初步的了解,那我们现在来小结一下。

这个并发的出现,我们可以看到它肯定是比传统串行的系统的效率,提高了不少,还极大地节省了时间。

就像前面的案例中,我们只有一个师傅的时候,如果是按干完一件任务再干下一件的顺序,那效率肯定是不高的。

但是采用了并发的方式后,可以把装刷墙、铺地板后的风干环节,合理地规划出来,就能节省出一天的时间,就足够拿来安装水电线了。

不过,在并发的过程中,也会带来了一些额外的性能开销。在 CPU 内部,它从一个任务中切换去完成另外一个任务的时候,是需要进行系统调度和上下文切换的,这个过程中都会带来一些性能开销。

关于 CPU 性能上的问题,我们后面再去做更细致的分析和讲解吧。

另外一个,多核 CPU 的出现,使并行成为了可能,极大程度上地提高了我们现在计算机的处理能力啊,像四核、八核的 CPU 已经非常普遍了,它们的性能特别的强,非常猛。

目前,大型的互联网公司,因为业务比较庞杂,加上海量的数据需要处理,哪怕你有一两台电脑性能很好的机器,恐怕也是不行的,他们如何解决呢?

在企业中,一般都会采用集群的搭建方式,十台机器不够,就上一百台机器,往上加就好了。这样就有足够的性能,能够支持去应对一些很大规模、很复杂的任务了。

目录
相关文章
|
8天前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
45 0
|
25天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
1天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
3天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
20 2
|
5天前
|
安全 Java 开发者
Java编程:深入探索其原理、特性与实战代码
Java编程:深入探索其原理、特性与实战代码
10 1
|
16天前
|
Java API 微服务
Java微服务架构:原理与实践
【4月更文挑战第15天】本文介绍了Java微服务架构的原理和实践,包括服务拆分、注册与发现、API网关、配置中心和分布式链路追踪。重点提及Spring Boot和Spring Cloud作为开发工具,以及Docker和Kubernetes用于容器化和集群管理。Java微服务架构旨在应对大规模、复杂业务系统的挑战,提升系统可用性和可扩展性。
|
18天前
|
Java
Java线程通信的精髓:解析通知等待机制的工作原理
Java线程通信的精髓:解析通知等待机制的工作原理
26 3
Java线程通信的精髓:解析通知等待机制的工作原理
|
18天前
|
存储 安全 Java
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
43 0
|
18天前
|
存储 安全 Java
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(上)
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)
35 0
|
20天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0