并发与并行的本质区别与实战应用解析
🧠 并发(Concurrency) vs 并行(Parallelism)
对比项 | 并发(Concurrency) | 并行(Parallelism) |
---|---|---|
定义 | 同一时间段多个任务交替执行,宏观上“同时进行” | 多个任务真正同时执行 |
资源使用 | 一个核也可以实现(通过时间片轮转) | 必须多个核(多线程或多进程同时运行) |
类比 | 一位厨师炒多道菜(轮流翻锅) | 多位厨师同时炒菜(每人一锅) |
编程角度 | 更多涉及线程调度、共享资源管理 | 更多涉及多线程/多进程计算密集任务分配 |
实现成本 | 相对低(比如线程池 + IO 密集型任务) | 成本高,需要 CPU 核心支持,适合计算密集型任务 |
应用场景 | Web 服务、数据库连接池、爬虫等 IO 密集型任务 | 图像处理、大数据计算、科学计算等 CPU 密集型任务 |
🎯 打个通俗类比:炒菜场景
- 并发:一个厨师炒五个菜,每次翻一下这锅、翻一下那锅,最终每锅都炒完了——这是并发。
- 并行:五个厨师,每人一锅,同时炒五道菜——这是并行。
👨💻 Java 角度解析(含图示)
并发:使用线程池处理 IO 请求(交替切换执行)
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(() -> fetchData());
executor.submit(() -> writeToFile());
并行:使用 ForkJoinPool
或 parallelStream
并行执行任务
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.parallelStream().forEach(System.out::println);
📈 Mermaid 图示:并发 vs 并行执行流程
🧩 面试延伸:深入提问点
-
Java 怎么实现并发与并行?
- 并发:线程池(如 ThreadPoolExecutor)、异步任务(CompletableFuture)
- 并行:
ForkJoinPool
、parallelStream
、ParallelArray
(JDK7)
-
线程多就能并行吗?
- ❌ 不一定,只有在 多核 CPU + 正确线程调度 + 无资源抢占冲突 的情况下才能实现并行。
- 多线程只是并发的基础设施,不代表必然并行。
-
并发一定比并行慢吗?
- 也不一定,IO 密集型任务中,并发更节省资源和开销,反而更快更稳。