题目:什么是并发,什么是并行?
难度:low
标签:java/thread, general/knowledge
评分:⭐⭐⭐⭐☆
并发跟并行看起来是一样的,但实际上是完全两种东西。并行是两任务同时在进行,它需要 CPU 多核去支撑,单核 CPU 是没有办法支撑这件事的。它的要求是两个任务同时并行的执行。而并发指的是在一定时间段内,同时时间段内有大量的请求被处理,一起来了多个请求,这个可以是单个 CPU 内核去处理,它可以通过它的分时系统,给不同的任务分配不同的时间片去处理这一件事,看上去是多个任务也是一起进行的,但实际上同一时间点上只进行了一个任务。这是我对并行跟并发的理解。
优点:核心区别抓得准;明确指出并行需要多核 CPU;提到分时系统和时间片,理解 OS 层调度
不足:"大量请求"表述稍偏,并发本质是"多任务交替"不限定数量;未延伸到 Java 层面(线程/线程池/虚拟线程);未点出并发带来的工程代价(竞态、可见性、有序性)
补充:更严谨的定义——并行 = N 个任务在 N 个执行单元上真正同时运行;并发 = M 个任务在单/多执行单元上通过调度交替运行
核心考点定位:能否清晰区分并发/并行本质,并延伸到并发编程的工程代价。
知识点拆解:
按「底层原理 → 设计权衡 → 工程实践」递进排列。
考察方向:
延伸递进面试题:
面试官您好,我先说一下我的理解。并发和并行看着像一回事,但本质是完全两种东西。
并行的核心是"同一时间点上真的同时",它需要多个执行单元——也就是多核 CPU——来支撑。双核 CPU 上两个任务可以真的在同一时钟周期上各占一个核跑。单核 CPU 无论怎么折腾都做不出真正的并行。
并发的核心是"多个任务在一段时间窗口内交替执行,看上去像是同时",它允许在单核上通过操作系统的分时调度实现。OS 给每个任务分配一个时间片,用完就切换上下文,因为切换足够快,用户看上去就是同时在进行。
所以关键区别是:并行强调"同一时间点",并发强调"一段时间窗口"。并行是硬件能力决定的,并发是调度策略决定的。
进一步说,并发会带来工程代价。多个任务同时访问共享资源时有竞态条件;一个线程改了共享变量另一个看不到,这是可见性问题;指令重排会带来有序性问题。这三个是并发编程最头疼的部分。Java 提供了一整套工具来解决:volatile 保证可见性和有序性、synchronized 和 Lock 保证互斥、AtomicXxx 和 CAS 提供无锁原子操作。
Java 生态里常见载体有:线程是基础、线程池做复用减少创建开销、CompletableFuture 编排异步任务、JDK 21 虚拟线程让并发更轻量。
以上就是我对并发和并行的理解。