Skip to content

并发和并行的区别

区别

  • 并发(Concurrency)
  • 多个任务在同一时间段内交替执行,逻辑上同时进行,实际可能串行。
  • 并行(Parallelism)
  • 多个任务在同一时刻真正同时执行,依赖多核 CPU 或多处理器。

核心点

  • 并发:任务管理,强调交替。
  • 并行:任务执行,强调同时。

1. 区别详解

(1) 定义

  • 并发
  • 处理多个任务的能力,通过时间片轮转或上下文切换实现。
  • 单核 CPU 可并发。
  • 并行
  • 多个任务物理上同时运行,需多核或多机支持。
  • 是并发的子集。

(2) 执行方式

  • 并发
  • 任务 A、B 在单核上快速切换(如线程 1 执行 10ms,线程 2 再 10ms)。
  • 用户感知为“同时”。
  • 并行
  • 任务 A、B 在不同核心上同时执行(如核心 1 跑 A,核心 2 跑 B)。

(3) 硬件依赖

  • 并发
  • 单核即可,无需多核。
  • 并行
  • 需多核 CPU 或多机器。

(4) 时间维度

  • 并发
  • 时间段内交替(如 1 秒内 A、B 各跑 500ms)。
  • 并行
  • 时间点上同步(如 1 秒内 A、B 同时完成)。

图示

并发 (单核):
时间轴: | A | B | A | B |
并行 (双核):
时间轴: | A       |
        |     B   |

示例

// 并发:单线程模拟
Thread t1 = new Thread(() -> System.out.println("Task 1"));
Thread t2 = new Thread(() -> System.out.println("Task 2"));
t1.start(); t2.start(); // 交替执行

// 并行:多核自动分配
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> System.out.println("Task 1"));
executor.submit(() -> System.out.println("Task 2"));
executor.shutdown(); // 多核并行

2. Java 中的体现

  • 并发
  • 多线程在单核 CPU 上运行。
  • ThreadExecutorService 在单核机器。
  • 并行
  • 多线程利用多核 CPU。
  • ForkJoinPool(JDK 1.7+)并行计算。

示例:Parallel Stream

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.parallelStream().forEach(System.out::println); // 多核并行

3. 特点对比

特性 并发 并行
定义 交替执行 同时执行
硬件要求 单核可行 需多核/多机
时间 时间段内 时间点上
目标 提高响应性 提高吞吐量
复杂度 涉及切换 依赖硬件分配

4. 延伸与面试角度

  • 联系
  • 并发是手段(调度),并行是结果(多核)。
  • 多核 CPU 上并发可实现并行。
  • 实际应用
  • 并发:Web 服务器处理请求。
  • 并行:大数据处理(如 MapReduce)。
  • 性能影响
  • 并发:上下文切换有开销。
  • 并行:充分利用硬件。
  • 面试点
  • 问“区别”时,提单核 vs 多核。
  • 问“例子”时,提线程和并行流。

总结

并发是多个任务交替执行,强调管理;并行是同时执行,依赖多核。Java 中并发靠线程调度,并行靠多核支持。面试时,可画时间轴或提应用场景,展示理解深度。