并发是单核上通过时间片轮转实现的逻辑同时执行,微观上指令交替运行;并行是多核上各线程独占物理核心、真正同一时刻执行不同指令流。

线程并发和并行在物理架构层面的根本区别,在于“是否真正同时执行”——这取决于底层硬件是否提供多个独立的执行单元。
并发:单核上的快速切换,本质是时间复用
在单核 CPU 上,所有线程都运行在同一个物理核心上。操作系统通过极短的时间片(如几毫秒)轮转调度线程:一个线程遇到 I/O 等待时被挂起,CPU 立即切到另一个就绪线程。宏观看多个线程“同时工作”,微观上始终只有一条指令在执行。
- 依赖机制:上下文切换、中断响应、调度器(如 Linux CFS)
- 典型场景:Tomcat 处理数百 HTTP 请求,多数线程处于 socket 等待状态,CPU 在活跃线程间来回跳转
- 瓶颈常在 I/O 调度或锁竞争,而非计算能力
并行:多核上的真正同步,本质是空间分摊
当系统拥有双核、四核或更多物理核心时,不同线程可被分配到不同核心上,各自拥有独立的 ALU、寄存器组和缓存行,真正意义上在同一纳秒级时刻执行不同指令流。
- 依赖机制:多核拓扑识别、亲和性调度(如 taskset)、无共享内存访问冲突
- 典型场景:Fork/Join 拆分数组求和,每个子任务由单独核心处理;parallelStream 自动将 list 分块后映射到多线程
- 瓶颈常在数据依赖、缓存一致性(如 MESI 协议开销)或线程间同步成本
关键判断依据:看线程是否能绕过调度器直接独占执行资源
如果两个线程的机器码指令可以在同一时钟周期内,分别在两个物理核心上被取指、译码、执行——这就是并行;否则,哪怕代码写了多线程,也仅是并发。
- 验证方法:Linux 下用 top -H 查看线程 CPU 使用率,再结合 lscpu 对照核心数;若多个线程长期显示 100% 占用且总和超过单核上限(如合计达 300%),说明发生了并行
- 注意陷阱:超线程(Hyper-Threading)提供的是逻辑核,两个线程共享同一物理核心的执行单元,仍属并发范畴,不是真正的并行
物理架构不决定写法,但决定效果。写对了并发逻辑,才能在并行硬件上安全释放多核算力。










