并行并发串行同步异步
在编程领域,并行、并发、串行、同步、异步是一组容易混淆但又至关重要的概念。以下是它们的核心定义、区别及典型场景分析:
一、核心概念定义
串行 | 任务按顺序执行,前一个任务完成后,后一个任务才开始 |
并行 | 多个任务在 同一时刻 同时执行(依赖多核CPU或分布式系统) |
并发 | 多个任务在 同一时间段 内交替执行(单核CPU通过分时复用实现) |
同步 | 任务执行时需要等待结果返回,线程会被阻塞 |
异步 | 任务执行时无需等待结果返回,通过回调或轮询获取结果,线程不会被阻塞 |
二、对比分析
1. 执行方式对比
时间 | 顺序执行 | 同时执行 | 交替执行 |
硬件 | 单核/多核 | 多核/多机 | 单核/多核 |
线程数 | 1 | ≥1 | ≥1 |
典型案例 | 单线程程序 | GPU渲染 | Web服务器 |
2. 同步与异步对比
阻塞性 | 阻塞线程 | 不阻塞线程 |
结果获取 | 立即返回 | 通过回调/轮询 |
编程模型 | 直接调用 | Future/Promise |
典型案例 |
|
|
三、代码示例
1. 串行执行
public class SerialExample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
// 任务1
task1();
// 任务2(必须等任务1完成)
task2();
System.out.println("总耗时:" + (System.currentTimeMillis() - start) + "ms");
}
private static void task1() {
try { Thread.sleep(1000); } catch (InterruptedException e) { }
System.out.println("任务1完成");
}
private static void task2() {
try { Thread.sleep(1000); } catch (InterruptedException e) { }
System.out.println("任务2完成");
}
}
// 输出:
// 任务1完成
// 任务2完成
// 总耗时:2000ms
2. 并行执行(多线程)
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ParallelExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> task1());
executor.submit(() -> task2());
executor.shutdown();
}
// 任务1和任务2同时执行,总耗时约1000ms
}
3. 同步与异步对比
import java.util.concurrent.CompletableFuture;
public class SyncAsyncExample {
public static void main(String[] args) {
// 同步调用
System.out.println("同步结果:" + syncMethod());
// 异步调用
CompletableFuture.supplyAsync(() -> asyncMethod())
.thenAccept(result -> System.out.println("异步结果:" + result));
// 主线程继续执行
System.out.println("主线程不阻塞");
}
private static String syncMethod() {
try { Thread.sleep(2000); } catch (InterruptedException e) { }
return "同步返回";
}
private static String asyncMethod() {
try { Thread.sleep(2000); } catch (InterruptedException e) { }
return "异步返回";
}
}
// 输出:
// 同步结果:同步返回
// 主线程不阻塞
// 异步结果:异步返回(2秒后输出)
四、应用场景
顺序依赖任务 | 串行 | 单线程程序 |
CPU密集型计算 | 并行 | 多线程、GPU编程、Hadoop |
高并发请求处理 | 并发 | Tomcat线程池、Nginx事件驱动 |
需要立即响应的操作 | 同步 | 方法直接调用 |
IO密集型操作 | 异步 | Netty、Node.js、RxJava |
五、常见误区
- “异步等于并行”错误。异步是结果通知机制(不阻塞线程),并行是执行方式(同时运行)。异步任务可能在单个线程中通过回调实现(如JavaScript)。
- “同步一定慢于异步”错误。同步代码无额外开销,适合简单且无需等待的任务;异步适合IO等待场景,但需处理回调地狱或复杂线程管理。
- “并发只能在多核环境实现”错误。并发是任务调度策略,单核CPU通过时间分片(如Java线程切换)也能实现。
六、扩展知识
- 混合模式:并行 + 并发:分布式系统中,多节点并行处理,每个节点内部并发处理任务。同步 + 异步:前端发送异步请求,后端同步处理业务逻辑。
- 性能优化:串行任务:通过减少依赖、拆分任务实现并行化。异步任务:合理使用线程池,避免上下文切换开销。
需要进一步了解具体实现细节(如Java的CompletableFuture或Netty异步编程),可以随时告诉我~
JUC编程 文章被收录于专栏
JUC 是 Java.util.concurrent 包的简称,它是 Java 5 引入的一个用于处理并发编程的工具包,为 Java 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。

