二者不能划等号
多线程是实现并发的一种手段;并发是程序运行的一种现象/能力。 而且并发 ≠ 并行。
1. 概念拆解
并发(Concurrency)
宏观上多个任务交替推进,同一时刻不一定同时执行。 单核CPU上,快速切换任务,看起来像一起跑,这就是并发。
核心:任务可以交替调度,不是同时执行
实现并发的方式不止多线程:
- 多进程
- 协程(Go协程、Python asyncio)
- 异步IO(单线程异步)
👉并发 ≠ 一定有多线程,单线程异步也能实现并发。
多线程(Multi-thread)
一个进程内部,创建多条执行流(线程),共享进程资源。 多线程只是并发的实现方案之一。 多线程程序,不一定是并发:比如所有线程串行排队执行,没有调度交替,就谈不上并发。
并行(Parallelism)
多核CPU,同一时刻多个任务真的同时运行。 并行属于并发的子集(广义并发包含并行),面试常区分:
- 并发:交替跑(单核也能做到)一定是交替跑吗【狭义并发:交替跑;广义并发包含两种情况:交替跑 + 同时跑(并行)】
- 并行:同时跑(必须多核)
2. 举例子
- 单线程异步(Node.js):只有1个线程,通过事件循环切换处理多个请求 →并发,但不是多线程
- Java多线程跑在单核CPU:多个线程轮流切换执行 →多线程,实现并发
- Java多线程跑在多核CPU:多个线程同时在不同核上跑 →多线程,并行(属于广义并发)