关于Java并发
Java并发编程通常会联想到进程、线程、并行、并发等概念。 这些概念代表了什么呢? 进程与线程有什么关系? 同时和并行有什么关系呢?
进程与线程
进程是程序的动态运行进程,通常计算机上运行的程序是进程,每个程序对应一个进程。 进程包含从代码加载到执行完成的完整进程,是操作系统资源分配的最小单位。线程是比进程小的执行单元,是CPU调度和分配的基本单元。 每个进程至少有一个线程。 相反,一个线程只属于一个进程。 线程可以调度和运算进程的所有资源。 线程可以由操作系统内核控制时间表,也可以由用户程序控制时间表。
多个CPU执行这三个过程,如下图所示。 每个进程至少包含一个线程。 例如,进程1包含四个线程,而进程2和进程3包含一个线程。 此外,每个进程都有自己的资源,进程中的所有线程都共享进程中包含的资源。
进程和线程
并发与并行
并发和并行可以对进程或线程执行。 并发是指一个或多个CPU在多个进程或线程之间复用。 简单来说,CPU依次执行多个任务,每个任务一点一点地执行。 从宏观上看,所有任务似乎都在同时执行。 并行是指多个进程或线程同时运行。 这必须在真正意义上同时执行,并支持多个CPU。 下图是并发和并行执行的时序图。 并行执行时,线程执行一定时间,线程2执行一定时间,线程3执行一定时间。 每个线程依次得到CPU的运行时间。 在这种情况下,只要有一个CPU就可以实现。 并行时,线程1、线程2和线程3同时运行。 在这种情况下,需要三个CPU才能实现。 并行性和并行性提高了CPU的资源利用率。
同时并行
Java并发在Java平台上实现,以实现并发机制,Java平台提供线程和线程的并发
在
多线程能提升执行效率
之前,我们了解到多线程可以同时运行和并行运行,因此多线程可以提高整体效率。 如果不支持多线程,当某个执行任务处于块等待状态时,块可能会降低执行效率。 如下图所示,某个请求任务开始请求后,开始等待响应。 此时,线程占用了CPU,不工作。 从整个执行线可以看到实际执行的(绿色方块)的时间少,就是执行效率低。 如果支持多线程并发,则可以在等待块时执行其他任务。 此外,在多CPU环境中,如果可以将单个任务划分为多个小任务,则可以同时在多个CPU上执行,因此单个CPU的执行能力有限,可以更快地执行任务。 如下图2所示,将任务分解为3个小任务后,可以在多CPU环境中并行执行,大大缩短了整体的执行时间。
单线程阻塞状态
多线程并行处理
多线程能提升用户体验
多线程也提高了用户体验。 如果一个线程的任务包含耗时的任务和用户交互任务,则用户体验可能会变差。 如下图所示,看到这些窗户团团转不能操作,会难受吗? 线程启动请求后,开始等待请求的结果,但用户界面保持不响应。 多线程可以将任务分为请求任务和接口操作,从而在请求后保持对接口操作的响应并提高用户体验。
界面卡住了
多线程让编码更难
没有免费的午餐,多线程化也需要成本。 从编写代码的角度来看,多线程使编码变得更复杂,本质上是 多线程机制与现代计算机结构所带来的。纵使在编程语言设计专家的努力下,现在有很多简化多线程编程的语言和模型,但相比于单线程来说多线程的编写仍然复杂很多。数据从主存储到CPU中间有若干层缓存和寄存器,而且多个线程可能访问共享内存,这就涉及到数据同步问题,从而增加了多线程编程的复杂性。此外,线程与线程之间的通信也比较麻烦,这也增加了多线程编码的复杂性。总之,尽管很多编程语言尝试为我们提供更便捷的多线程编程,但在语言层面仍然无法完全屏蔽掉多线程与计算机结构的复杂性,所以不管我们使用什么语言都需要为多线程的编码考虑得更多。上下文切换与资源开销
多线程除了增加编码难度外,它还在执行过程中带来实际的损耗,包括资源开销和上下文切换开销。资源开销主要包括其本身占用的内存资源、执行时线程本地栈开销以及对这些线程进行管理的开销。而上下文切换开销则是因为CPU由一个线程切换到另外一个线程是需要做现场保护和现场恢复工作,包括线程标识、寄存器内存、线程状态、线程优先级、线程资源清单等等。如下图所示,假设线程一和线程二由某个CPU执行。线程一执行一段时间后将相关信息保存到现场数据结构中,而线程数据结构存放在主存储中,然后从线程二对应的现场数据结构中恢复线程二相关信息,完成现场恢复后线程二开始执行。接下去的过程反过来,由线程二切换到线程一。其中可以看到由虚线分割的两部分被标为切换开销,从完整的时序来看,这两部分并非执行线程的任务,而是消耗在了现场的保护和恢复上了,这便是上下文切换的开销。
在实践中我们要综合考虑多线程的优缺点,不能一味的去追求多线程,在使用多线程之前我们必须去衡量多线程带来的好处与代价。
更多Java并发原理可关注作者下面的专栏:
作者简介:笔名seaboat,擅长人工智能、计算机科学、数学原理、基础算法。出版书籍:图解数据结构与算法、Tomcat内核设计剖析、图解Java并发原理、人工智能原理科普。