概述

并发(Concurrency)与并行(Parallelism)是多线程编程中的核心概念,但二者并非同一回事。

  • 并发是指多个任务在重叠的时间段内启动、运行和完成,它们之间没有特定的顺序。
  • 并行是指多个任务(或单个任务的多个部分)实际上在同一时刻运行(例如在多核处理器上)。

下文将详细阐述这两个概念的具体含义及其区别。

并发 (Concurrency)

并发本质上适用于至少两个或更多任务的场景。当一个应用程序能够同时处理多个任务时,我们将其称为并发应用程序。

虽然这些任务看起来像是同时运行的,但实际上它们可能并非如此。并发利用操作系统的 CPU 时间分片(Time Slicing) 功能:每个任务运行一部分后进入等待状态,当第一个任务等待时,CPU 被分配给第二个任务以完成其部分工作。

因此,操作系统根据任务的优先级分配 CPU 和其他计算资源(如内存),依次处理所有任务并给予它们完成的机会。对于最终用户而言,所有任务似乎是并行运行的,这即为并发

并行 (Parallelism)

并行并不一定需要两个独立的任务存在。通过使用 CPU 的多核基础架构,系统可以为每个任务或子任务分配一个内核,从而实际上同时运行部分任务或多个任务。

并行性本质上要求硬件具有多个处理单元。在单核 CPU 中,您可能会获得并发性,但无法获得并行性。

核心差异对比

以下是并发与并行之间的显著差异:

维度并发 (Concurrency)并行 (Parallelism)
定义任务在重叠的时间段内启动、运行和完成。任务实际上在同一时刻运行(如多核处理器)。
本质独立执行进程的组合。同时执行(可能相关的)计算。
通俗理解一次处理很多事情 (Dealing with lots of things)。一次很多事情 (Doing lots of things)。
硬件要求单核或多核均可实现。必须具备多核或多处理单元硬件。

应用组合场景

根据硬件环境与任务调度方式,应用程序可能存在以下四种组合情况:

  1. 仅并发,非并行:应用程序可以同时处理多个任务,但没有两个任务可以同时执行(例如单核 CPU 上的多线程应用)。
  2. 仅并行,非并发:应用程序利用多核 CPU 同时处理一个任务的多个子任务,但不涉及多个独立任务的调度。
  3. 既非并行,也非并发:应用程序一次顺序地处理所有任务。
  4. 既并行,也并发:应用程序在多核 CPU 中同时处理多个独立任务(这是高性能多线程应用的理想状态)。

结语

以上内容涵盖了并发与并行性的核心概念,这是理解 Java 多线程机制及其他并发编程模型的重要基础。

祝您学习愉快!