并发和并行的区别
区别
- 并发(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 上运行。
- 如
Thread
或ExecutorService
在单核机器。 - 并行:
- 多线程利用多核 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 中并发靠线程调度,并行靠多核支持。面试时,可画时间轴或提应用场景,展示理解深度。