并发编程(一):多线程与上下文切换,从 “什么时候用” 到 “隐形消耗”
今天咱们开个新坑聊聊并发编程。很多人一上来就觉得 “多线程 快”恨不得把所有代码都写成多线程结果线上一跑不仅没快反而更慢了还多了一堆莫名其妙的问题。今天咱们就用大白话讲一讲 “多线程到底什么时候用”“用多少线程才合适”以及它背后的 “隐形杀手”—— 上下文切换。一、多线程到底是干嘛的简单来说你是一个老板手下有个工人单线程他干活很卖力但中间经常要等材料比如等网络请求、等硬盘 IO。等材料的时候他就站那儿摸鱼啥也不干你付着工资他却在发呆。这时候你再雇几个工人多线程第一个工人等材料的时候第二个、第三个工人就可以接着干别的活这样整体效率就上去了。多线程的本质就是利用 “等待时间”让 CPU 别闲着。它解决的核心问题是CPU 浪费比例严重。二、关键指标CPU 浪费比例什么是 “CPU 浪费比例”就是 “等待时间” 和 “干活时间” 的比值。CPU浪费比例 等待时间 / 干活时间如果一个任务干活 2ms等待 42ms那浪费比例就是 42 / 2 21。这意味着CPU 有 21 倍的时间在摸鱼这时候开多线程收益巨大。如果一个任务干活 2s等待 1s浪费比例是 0.5这时候开多线程收益就很小甚至可能因为线程切换反而更慢。记住多线程只适合 “CPU 浪费比例 1” 的场景。不是 “等待时间长” 就适合而是 “等待时间远大于干活时间” 才适合。三、线程数量怎么算很多人会问“我开多少线程合适”答案是看摸鱼时间。还是刚才的例子干活2ms摸鱼42ms总耗时44ms如果只开 1 个线程那它 42ms 在摸鱼2ms 在干活效率极低。如果开 22 个线程每个线程摸鱼 42ms干活 2ms。当第 1 个线程开始摸鱼时第 2 个线程就可以开始干活。这样CPU 几乎全程都在干活没有浪费。线程数 ≈ 等待时间 / 干活时间 1这个公式不是绝对的但它给了我们一个非常重要的直觉线程数是由 “等待时间” 决定的不是越多越好。四、反例不是所有场景都适合多线程咱们再看一个反例处理图片。任务从网络下载一张图片等待 1s然后对图片进行压缩干活 2s。浪费比例1 / 2 0.5。这时候如果你开 10 个线程每个线程都要先等 1s再干 2s。线程之间频繁切换光 “换岗” 就耗了不少时间。最终总耗时可能比单线程还要长。这就像雇 10 个工人干 1 个活大家轮流上光协调、排队的时间比干活时间还长。所以多线程滥用只会自讨苦吃。五、多线程的 “副作用”上下文切换当我们开了多线程让 CPU “忙起来” 的时候一个新的问题出现了上下文切换。咱们还是用工人的例子来理解现在你有 22 个工人但只有一个工作台CPU 核心。大家轮流上每个人干一会儿就换下一个。每次换人都要把上一个工人的 “干活进度”比如算到哪一步了、手里拿了什么工具记下来再把下一个工人的进度恢复。这个 “记下来、再恢复” 的过程就是上下文切换。1. 上下文切换的“开销”有多大在现代 CPU 上一次上下文切换的时间大约是不到 1 毫秒。听起来不多但如果每秒切换 1000 多次累积起来就是1000 次 / 秒 × 1ms / 次 1 秒 / 秒这意味着CPU 一半的时间都在 “换岗”而不是在 “干活”。这就是多线程的 “隐形消耗”。2. 上下文切换不是越少越好很多人一看到切换开销就想“那我少开点线程切换不就少了吗”这又走进了另一个误区如果线程太少CPU 又会回到 “摸鱼” 的状态浪费大量时间。如果线程太多切换太频繁CPU 又会把时间都花在 “换岗” 上。所以线程数量和上下文切换次数需要达到一个平衡才能达到最优性能。线程太少 → CPU 浪费比例增高整体变慢。线程太多 → 上下文切换频繁整体变慢。性能最佳的核心是线程数量合适而不是上下文切换次数最少。六、如何减少不必要的上下文切换既然切换是必要的但又不能太多我们该怎么办核心思路是减少线程的 “无效等待”。使用线程池复用线程避免频繁创建和销毁线程减少切换。避免锁竞争锁竞争会导致线程阻塞频繁从阻塞队列到就绪队列的切换。使用无锁编程比如 CAS、ThreadLocal从根源上消除锁竞争。控制线程数量根据 “CPU 浪费比例” 计算合适的线程数不要盲目开多。七、总结多线程的 “适用边界” 与 “平衡之道”最后咱们用几句话总结一下今天的核心内容多线程的本质利用 “等待时间”让 CPU 别闲着。适用场景CPU 浪费比例严重等待时间远大于干活时间比如网络 IO、数据库操作、文件读写。线程数量由 “等待时间” 和 “干活时间” 的比例决定不是越多越好。隐形消耗上下文切换是多线程的必要代价单次开销小但频繁切换会累积成巨大消耗。平衡之道线程数量和切换次数要匹配既不浪费 CPU也不浪费切换时间。

相关新闻

SMT轨迹导入程序:用C#解析DXF文件生成G代码

SMT轨迹导入程序:用C#解析DXF文件生成G代码

SMT轨迹导入程序C#导入CAD的DXF文件生成G代码源码 最近在做一个SMT贴片机的轨迹导入程序,需要把CAD设计的DXF文件导入到SMT设备中生成G代码。这个过程听起来不复杂,但涉及到DXF文件的解析和G代码的生成,还是需要仔细研究一下。 DXF文件是什…

2026/5/17 6:38:47 阅读更多 →
开源爆款!Spring Boot+Vue3 多租户自助门店系统天花板:台球/棋牌/茶室/体育场馆全适配,硬件深度集成,真正实现无人值守

开源爆款!Spring Boot+Vue3 多租户自助门店系统天花板:台球/棋牌/茶室/体育场馆全适配,硬件深度集成,真正实现无人值守

01 项目概述 智场未来多租户自助门店系统是一套完整的线下实体空间数字化解决方案,涵盖微信小程序端(用户端)、员工APP端、Web管理后台(总平台/门店端)及IoT物联网中台四大核心模块。 平台聚焦台球厅、棋牌室、24h共…

2026/7/4 6:31:40 阅读更多 →
点播直播视频会议EasyDSS一站式视频云平台如何重塑企业数字化协作新生态

点播直播视频会议EasyDSS一站式视频云平台如何重塑企业数字化协作新生态

在5G商用加速、AI技术渗透与元宇宙概念兴起的交汇点上,视频已从单一的信息载体演变为数字经济时代的核心生产要素。企业对视频技术的需求不再局限于简单的信息传递,而是延伸至业务创新、流程再造和价值重构的深层次变革。EasyDSS一站式视频云平台&#x…

2026/5/17 6:38:45 阅读更多 →

最新新闻

Plone 4教职员目录系统:组织级身份服务中间件实践

Plone 4教职员目录系统:组织级身份服务中间件实践

1. 项目概述:一个被低估的组织级信息基础设施重建 Plone 4 时代的 Faculty/Staff Directory(教职员工名录)绝不是简单做个“通讯录页面”——它是一套嵌入在高校数字生态毛细血管里的身份服务中间件。我2012年接手某州立大学文理学院的这个项…

2026/7/6 10:26:00 阅读更多 →
Excel乘法的三层逻辑:从单元格相乘到矩阵运算

Excel乘法的三层逻辑:从单元格相乘到矩阵运算

1. 为什么“乘法”是Excel里最被低估却最该优先掌握的核心能力 很多人刚学Excel时,第一反应是学求和、排序、筛选——这没错,但真正拉开效率差距的,往往不是你会不会用数据透视表,而是你能不能在3秒内把一整列价格打85折、把12个月…

2026/7/6 10:26:00 阅读更多 →
Hermes+Kimi K2.6构建高可用智能体生产流水线

Hermes+Kimi K2.6构建高可用智能体生产流水线

1. 项目概述:这不是一个“搭个API就能跑”的玩具,而是一套可量产、能扛压的智能体生产流水线“万字保姆级教程:HermesKimi K2.6 打造7x24h Agent军团”——光看标题,你可能以为这是又一篇调用大模型API的入门笔记。但实际操作过的…

2026/7/6 10:23:56 阅读更多 →
STM32F407ZG与MC6470 IMU的硬件协同设计与姿态解算

STM32F407ZG与MC6470 IMU的硬件协同设计与姿态解算

1. MC6470与STM32F407ZG的硬件协同设计MC6470作为一款6自由度惯性测量单元(IMU),其核心价值在于集成了三轴加速度计和三轴陀螺仪于单芯片中。在实际项目中,这款IMU的加速度计量程可达16g,陀螺仪范围达2000dps,且内置数字运动处理器…

2026/7/6 10:23:56 阅读更多 →
家政服务全流程实战项目:客户预约+师傅接单+评价反馈+后台数据看板

家政服务全流程实战项目:客户预约+师傅接单+评价反馈+后台数据看板

本文还有配套的精品资源,点击获取 简介:一个开箱即用的家政服务管理系统,完整跑通从客户下单到服务闭环的业务链路。客户侧支持服务浏览、在线预约、订单查询、服务后打分评价;师傅端可登录个人中心,实时接收新订单…

2026/7/6 10:17:48 阅读更多 →
Diazo Plone主题开发:XML规则驱动的HTML结构重写技术

Diazo Plone主题开发:XML规则驱动的HTML结构重写技术

1. 项目概述:Diazo不是CSS编辑器,而是Plone主题的“外科手术刀” 如果你在Plone社区里搜“怎么换皮肤”“Plone主题怎么做”,十有八九会撞上Diazo这个词——但它绝不是你想象中那种拖拽改颜色、点几下就能出效果的可视化主题工具。我从2012年…

2026/7/6 10:17:48 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻