← 每日面试题 学习看板

什么是并发,什么是并行?

面试题/00java/02Java 并发编程/01线程基础概念/什么是并发,什么是并行?.md

面试记录 2026-09-26

题目:什么是并发,什么是并行?

难度:low

标签:java/thread, general/knowledge

评分:⭐⭐⭐⭐☆

我的回答

并发跟并行看起来是一样的,但实际上是完全两种东西。并行是两任务同时在进行,它需要 CPU 多核去支撑,单核 CPU 是没有办法支撑这件事的。它的要求是两个任务同时并行的执行。而并发指的是在一定时间段内,同时时间段内有大量的请求被处理,一起来了多个请求,这个可以是单个 CPU 内核去处理,它可以通过它的分时系统,给不同的任务分配不同的时间片去处理这一件事,看上去是多个任务也是一起进行的,但实际上同一时间点上只进行了一个任务。这是我对并行跟并发的理解。

点评

优点:核心区别抓得准;明确指出并行需要多核 CPU;提到分时系统和时间片,理解 OS 层调度

不足:"大量请求"表述稍偏,并发本质是"多任务交替"不限定数量;未延伸到 Java 层面(线程/线程池/虚拟线程);未点出并发带来的工程代价(竞态、可见性、有序性)

补充:更严谨的定义——并行 = N 个任务在 N 个执行单元上真正同时运行;并发 = M 个任务在单/多执行单元上通过调度交替运行

完整讲解

第一部分:知识重点剖析

核心考点定位:能否清晰区分并发/并行本质,并延伸到并发编程的工程代价。

知识点拆解:

  1. 底层定义差异:并行 = "同一时间点上多个任务真的同时执行",需要多个执行单元(多核 CPU);并发 = "多个任务在一段时间窗口内交替执行、看上去同时",可在单核通过时间片实现
  2. 调度机制:并发依赖操作系统分时调度(time-slicing),上下文切换是核心动作;并行由 OS 把任务分配到多核,各核独立跑,还涉及 NUMA 亲和性
  3. 工程代价:并发引入三大问题——竞态(race condition)、可见性(visibility)、有序性(ordering);这是后续 JMM/volatile/synchronized 的根源
  4. Java 中的体现:线程(用户态并发)、线程池(复用减少创建开销)、CompletableFuture(异步编排)、虚拟线程(JDK21,M:N 调度让并发更轻量)
按「底层原理 → 设计权衡 → 工程实践」递进排列。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. Java 中有哪些并发编程的工具?分别解决什么问题?
  1. 并发和并行哪个性能更好?
  1. 虚拟线程为什么让并发更简单?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,我先说一下我的理解。并发和并行看着像一回事,但本质是完全两种东西。

并行的核心是"同一时间点上真的同时",它需要多个执行单元——也就是多核 CPU——来支撑。双核 CPU 上两个任务可以真的在同一时钟周期上各占一个核跑。单核 CPU 无论怎么折腾都做不出真正的并行。

并发的核心是"多个任务在一段时间窗口内交替执行,看上去像是同时",它允许在单核上通过操作系统的分时调度实现。OS 给每个任务分配一个时间片,用完就切换上下文,因为切换足够快,用户看上去就是同时在进行。

所以关键区别是:并行强调"同一时间点",并发强调"一段时间窗口"。并行是硬件能力决定的,并发是调度策略决定的。

进一步说,并发会带来工程代价。多个任务同时访问共享资源时有竞态条件;一个线程改了共享变量另一个看不到,这是可见性问题;指令重排会带来有序性问题。这三个是并发编程最头疼的部分。Java 提供了一整套工具来解决:volatile 保证可见性和有序性、synchronized 和 Lock 保证互斥、AtomicXxx 和 CAS 提供无锁原子操作。

Java 生态里常见载体有:线程是基础、线程池做复用减少创建开销、CompletableFuture 编排异步任务、JDK 21 虚拟线程让并发更轻量。

以上就是我对并发和并行的理解。