Java并发-理论基础
# 前言
本文主要介绍并发的背景以及一些领域概念,比如并发与并行、多线程与多进程、并发的优缺点等等,了解这些问题概念有利于更好的理解并发编程的原理与技术。
# 并发与并行
引用 Erlang 之父 Joe Armstrong 经典的解释图
这个图非常浅显的解释了,并发与并行的区别
# 并发
- 两个队列排队使用同一台咖啡机,虽然有两个队列,但是他们只能轮流使用一个咖啡机
- 虽然有两个队列,但是同时只会有一个人在使用咖啡机
这就像在一个多线程程序中,多个线程在同一个处理器上运行,它们必须轮流使用处理器资源。虽然这些线程似乎在同时运行,但实际上处理器在不同的时间片轮流执行每个线程的任务。
# 并行
- 有两个队列在排队,但是是分别使用两个咖啡机
- 同一时间有两个咖啡机分别为两个队列服务
这就像在一个多处理器系统中,多个线程可以在不同的处理器上同时运行。每个处理器可以独立地执行一个线程的任务,所以这些线程是真正同时运行的。
简单来说并发与并行的区别在于:并发是多个任务交替在运行,在同一时间只有一个任务在执行,需要去竞争资源(咖啡机),而并行则是同一时刻存在多个任务在运行,互相无资源竞争影响。
# 进程与线程
# 进程 (Process)
是一个独立的执行单元,每个进程都有自己的专用资源,如内存、CPU 时间和存储,每个进程都会做自己的任务,一般进程间是不会共享资源的。
# 线程 (Thread)
是进程内的一个执行单元,多个线程共享同一个进程的内存空间和资源,但每个线程有自己的堆栈,线程之间是可以共享资源的。
可以看到进程和线程存在多种组合的形态,整体来说:
- 线程是最小的执行单元
- 线程是进程的一部分,一个进程可以包含一个或者多个线程
- 线程之间是可以共享资源的(共享的是进程的资源)
- 进程之间通常是不共享资源的(共享难度比较大,需要进程之间的通信)
# 多线程与多进程
不管是多进程还是多线程都可以实现并发与并行
并发:在单核处理器上,多个进程通过时间片轮转的方式交替执行,实现并发。操作系统调度器在不同进程之间快速切换,使得它们看起来像是同时执行的,但实际上在任一时刻只有一个进程在执行。
并行:在多核处理器上,多个进程可以真正同时运行在不同的核心上,实现并行。每个核心可以独立执行一个进程的任务,这样多个进程可以在同一时刻并行执行。
选择多进程还是多线程一般考虑如下
如果需要频繁共享数据和资源,多线程可能是更好的选择,因为线程之间共享同一进程的内存空间。
如果需要高隔离性和稳定性,多进程可能更适合,因为每个进程有自己独立的内存空间,一个进程的崩溃不会影响其他进程。
具体还要看使用的编程语言,不同的语言默认会有多线程或者多进程的实现,简化用户编程
# 并发编程的优缺点
# 优点
缺点