当前位置: 首页 > news >正文

并发 vs 并行编程详解

并发 vs 并行编程详解

理解并发(Concurrency)和并行(Parallelism)是掌握多线程编程的核心基础。下面通过生活化比喻、技术原理和实际代码示例,帮助你彻底区分这两大概念。


一、核心概念对比

1. 生活化比喻

概念比喻场景核心区别
并发餐厅单服务员多桌点餐交替处理(看似同时,实际快速切换)
并行餐厅多服务员同时服务不同桌真正同时执行(物理上的同步处理)

2. 技术定义

  • 并发:多个任务在同一时间段内交替执行(单核或多核均可)
  • 并行:多个任务真正同时执行(必须多核支持)

二、核心原理图解

1. 并发(单核CPU)

CPU Task1 Task2 执行片段 切换执行 再次切换 继续执行 CPU Task1 Task2
  • 特点:通过时间片轮转(Time Slicing)模拟"同时"执行
  • 场景:Web服务器处理多请求、GUI界面响应

2. 并行(多核CPU)

CPU Core1
Task1
CPU Core2
Task2
  • 特点:物理上的同时执行
  • 场景:大数据处理、科学计算

三、Java中的实现方式

1. 并发编程示例

ExecutorService executor = Executors.newFixedThreadPool(2); // 线程池
executor.submit(() -> {while (!Thread.currentThread().isInterrupted()) {System.out.println("处理订单");}
});
executor.submit(() -> {while (!Thread.currentThread().isInterrupted()) {System.out.println("烹饪菜品");}
});
executor.shutdown();
  • 代码逻辑:两个任务在单核上交替执行(并发)

2. 并行编程示例

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 顺序处理(单线程)
numbers.stream().forEach(n -> process(n)); // 并行处理(多线程)
numbers.parallelStream().forEach(n -> process(n)); 
  • 代码逻辑:利用多核同时处理集合元素(并行)

四、选择依据与优化策略

1. 何时选择并发?

  • 任务需要频繁等待I/O(如网络请求、文件读写)
  • 需要保持用户界面响应
  • 任务间存在依赖关系

2. 何时选择并行?

  • 计算密集型任务(如视频编码、矩阵运算)
  • 数据可分片处理且无共享状态
  • 硬件支持多核(如服务器集群)

3. 性能优化要点

场景优化策略
高并发I/O使用NIO(非阻塞I/O)
计算密集型并行使用Fork/Join框架
数据共享减少锁竞争(CAS原子操作)

五、常见误区与问题

1. 误区:并发一定比顺序执行快

  • 真相:如果任务都是CPU密集型,单核上的并发反而更慢(切换开销)

2. 误区:并行可以无限加速

  • 阿姆达尔定律:加速上限取决于代码中必须串行的部分
    S = \frac{1}{(1 - P) + \frac{P}{N}}
    
    • S:加速比
    • P:可并行部分比例
    • N:处理器核心数

3. 典型问题:竞态条件(Race Condition)

// 错误示例:多线程共享变量
public class Counter {private int count = 0;public void increment() {count++; // 非原子操作}
}// 正确方案:使用AtomicInteger
private AtomicInteger count = new AtomicInteger(0);
public void increment() {count.incrementAndGet();
}

六、总结与记忆口诀

对比总结表

维度并发(Concurrency)并行(Parallelism)
目标提高资源利用率提高计算速度
实现条件单核/多核均可必须多核/分布式
典型应用Web服务器、GUI应用大数据处理、科学计算
编程重点任务调度、状态同步任务拆分、负载均衡

记忆口诀

“并发像单核餐厅,服务员快速轮转桌,
并行是多核厨房,厨师同时炒菜不耽搁。
选并发还是并行?看任务是等I/O或计算,
共享资源要小心,锁和原子操作别忘做!”


相关文章:

  • el-form的label星号位置如何修改
  • Vue3 路由配置与跳转传参完整指南
  • MySQL主从同步(主从复制)
  • RDD行动算子案例
  • 论文分享➲ ICLR2025 Oral | Scaling and evaluating sparse autoencoders
  • 使用 Spring 和 Redis 创建处理敏感数据的服务
  • 剪映学习03
  • 常见图像融合算法(图像泊松融合)
  • neo4j图数据库基本概念和向量使用
  • python小区物业管理系统-小区物业报修系统
  • Missashe高数强化学习笔记(随时更新)
  • Redis 存储原理与数据模型(三)
  • 字符串---Spring字符串基本处理
  • TensorFlow中数据集的创建
  • 《时序数据库全球格局:国产与国外主流方案的对比分析》
  • 数据库的SQLSTATE[23000]异常,通过自定义异常类来提供更友好的提示信息
  • 2021-11-15 C++下一个生日天数
  • UnityDots学习(五)
  • 【大模型】LLM概念相关问题(上)
  • C语言编程--19.括号生成
  • 工行回应两售出金条发现疑似杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 中国天主教组织发贺电对新教皇当选表示祝贺
  • 马上评|比余华与史铁生的友情更动人的是什么
  • 专访|高圆圆:像鸟儿一样,柔弱也自由
  • 上海发布大风黄警:预计未来24小时内将出现8-10级大风
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)