并发与并行:本质区别与实践场景详解

帅旋
帅旋
订阅
充电
发布于 2024-05-02 | 更新于 2025-07-13

1. 引言

在当今多核处理器与分布式系统普及的背景下,“并发”(Concurrency)与“并行”(Parallelism)成为每个开发者都必须理解的关键词。虽然二者常被混用,但它们在概念、实现方式和适用场景上都有显著差异。

2. 并发(Concurrency)

在操作系统和多线程环境中,并发体现为多个任务在单核或单线程环境下通过时间片轮转快速切换执行,以模拟同时运行的效果。时间片是分配给每个任务的短暂 CPU 时间段,由调度器负责切换,从而在宏观层面上实现任务交叠执行。

从概念上来说,并发指在同一时段内,系统能够管理和交替处理多个任务或请求,但在任意时刻只真正执行一个操作。

  • 时间切片:操作系统通过时间片(time slice)或协程调度,让多个任务看似同时运行。
  • 资源复用:同一线程或处理器核心在不同任务间快速切换,以提高资源利用率。

下面具体案例来说明:

宏观与微观表现

宏观表现:多个进程或线程在用户层面似乎在同时活动,例如 Web 服务器同时应对上千条请求。

微观表现:CPU 或线程池在内部以快速交替的方式执行任务,只有一个线程实际占用 CPU 资源。

并发适用的场景如下:

  • IO 密集型任务:如网络请求、文件读写等,CPU 多数时间在等待外部资源。
  • 高并发请求处理:Web 服务、消息队列、数据库连接池等,需要快速切换、复用连接,以提升吞吐量。

3. 并行(Parallelism)

什么是并行?

并行指在同一时刻,系统在多个处理器核心或多个节点上同时执行多个任务或指令,以获得更高的吞吐能力。

  • 多核/多线程:每个核心独立执行不同的任务或同一大任务的不同子任务。
  • 分布式计算:在多台服务器上并行分担计算负载,如大规模数据处理(Hadoop、Spark)。

宏观与微观表现

  • 宏观表现:从任意观察角度都能看到多个任务在同一瞬间真正地并发运行。
  • 微观表现:每个核心或处理器都有独立的寄存器、缓存等,可以并行推进计算流程。

并行适用的场景如下:

  • CPU 密集型任务:图像处理、科学计算、密码学算法等,需要大量运算能力。
  • 大数据处理:批量 ETL、机器学习模型训练等,通过分片和合并提升性能。

4. 并发 vs 并行:核心对比

维度 并发 并行
本质 时间上交错,多任务“假同时” 空间上真实,多核心“真同时”
实现方式 操作系统调度、协程切换 多核 CPU、分布式集群
典型场景 IO 密集、网络请求、用户交互 CPU 密集、科学计算、大数据分析
目标 提升资源利用率与响应速度 最大化吞吐量与完成速度

5. 代码示例对比

1
2
3
4
5
6
7
8
9
10
// 并发示例:线程池处理大量短小任务
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 100; i++) {
executor.submit(() -> {
// 模拟 IO 操作
Thread.sleep(100);
System.out.println("处理完成:" + Thread.currentThread().getName());
});
}
executor.shutdown();
1
2
3
4
5
6
// 并行示例:使用并行流处理 CPU 密集型计算
List<Integer> list = IntStream.range(1, 1_000_000).boxed().collect(Collectors.toList());
long sum = list.parallelStream()
.mapToInt(i -> i * i)
.sum();
System.out.println("平方和:" + sum);

图示建议

  • 并发调度示意图:多个任务在一个核心上轮流执行的时间线
  • 并行执行示意图:多核心同时处理不同任务的空间分布图
    (若添加,请在文中相应位置留空标记:![并行示意图](path/to/image){alt="多核并行执行示意图"}

6. 实践建议

  1. 评估任务特性:先判断是 IO 密集还是 CPU 密集。
  2. 资源规划:IO 密集可优先考虑协程或线程池并发;CPU 密集可充分利用并行流、Fork/Join 框架或分布式集群。
  3. 混合模式:复杂系统中常同时存在并发与并行,可结合 Reactor、Disruptor 等框架实现“并发调度 + 并行计算”模式。

7. 结语与号召

理解并发与并行的本质区别,是设计高性能系统的基石。
欢迎在评论区分享你的实战经验或提出疑问,关注本专栏获取更多并发编程干货!

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/juc/concurrency-vs-parallelism.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请订阅本站。

×
帅旋DevShow

订阅及时获取网站内容更新。

充电

当前电量:100%

帅旋DevShow

订阅我,及时获取网站内容更新。