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

同步阻塞和异步非阻塞是什么?

一、同步阻塞(Synchronous Blocking)

定义:发起请求后,当前线程会一直等待结果返回,期间无法执行其他任务,就像"打电话点外卖,一直等对方确认,没确认不干别的"。
关键特点:

  1. 线程挂起:等待期间线程被"冻结",占用CPU资源却无法做任何事情。
  2. 顺序执行:任务必须按顺序完成,前一步未完成,后一步无法启动。
  3. 简单但低效:适合简单场景,但高并发时易成为性能瓶颈。
    生活例子:
  • 排队买奶茶:你站在柜台前,必须等前面所有人买完才能轮到自己,期间只能干等。
  • 传统ATM取款:你站在机器前,必须等操作完成才能离开,期间无法做其他事。
    编程场景:
  • Java BIO(同步阻塞IO):服务器每处理一个客户端请求,需创建一个新线程阻塞等待响应,线程数过多会导致资源耗尽。
  • PHP-FPM默认模式:请求处理期间,进程被完全占用,无法响应其他请求。

二、异步非阻塞(Asynchronous Non-blocking)

定义:发起请求后,线程立即返回继续执行其他任务,结果通过回调或通知机制获取,就像"点外卖后继续干别的,等送到后通知你"。
关键特点:

  1. 线程不挂起:等待期间线程可处理其他任务,资源利用率高。
  2. 事件驱动:通过回调函数、Future/Promise等机制获取结果,无需主动轮询。
  3. 高并发友好:适合IO密集型场景,如网络请求、文件读写。
    生活例子:
  • 在线点餐:下单后继续工作,等外卖小哥打电话通知你取餐。
  • 柜台取号:提交请求后取个号,坐在椅子上刷手机,等广播通知才去办理。
    编程场景:
  • Node.js:基于事件循环和回调机制,单线程处理大量并发请求。
  • Java NIO/AIO:通过Selector多路复用或CompletableFuture实现异步非阻塞IO,提升吞吐量。
  • Python asyncio:协程实现并发任务调度,避免线程切换开销。

三、核心区别对比

维度同步阻塞异步非阻塞
线程状态阻塞等待,无法执行其他任务非阻塞,可继续处理其他任务
资源占用浪费CPU资源(线程挂起)高效利用CPU资源
适用场景简单任务、顺序依赖强的场景高并发、IO密集型场景
编程复杂度低,逻辑清晰高,需处理回调或状态管理
典型例子传统银行排队、BIO网络模型Node.js、Nginx、异步协程

四、为什么异步非阻塞更高效?

  1. 避免线程浪费:线程在等待IO时不会闲置,可处理其他请求,提升吞吐量。
  2. 减少上下文切换:单线程通过事件循环管理任务(如Node.js),避免多线程切换开销。
  3. 扩展性更强:适合大规模并发,如百万级连接的服务器(如Nginx)。
    反例:如果用同步阻塞处理10万QPS请求,服务器线程会被完全占满,导致响应超时;而异步非阻塞可通过少量线程高效调度任务。

五、如何选择?

选同步阻塞:任务简单、依赖严格顺序、资源充足(如单线程计算)。

  • 选异步非阻塞:高并发、IO密集型、资源敏感(如Web服务器、实时消息系统)。

💡 总结:同步阻塞是"一根筋",干一件事等结果;异步非阻塞是"多线程玩家",边干边等效率翻倍。现代系统追求高性能,异步非阻塞已成为主流方案,但需权衡复杂度与收益。

http://www.xdnf.cn/news/18861.html

相关文章:

  • 学习做动画1.简易行走
  • springBoot如何加载类(以atomikos框架中的事务类为例)
  • MIT 6.5840 (Spring, 2024) 通关指南——入门篇
  • MYSQL-表的约束(下)
  • 【机器学习】5 Bayesian statistics
  • 46.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成日志
  • 前端漏洞(上)- Django debug page XSS漏洞(漏洞编号:CVE-2017-12794)
  • 【C++组件】ODB 安装与使用
  • 春秋云镜 TOISEC 部分WP
  • 3.1 存储系统概述 (答案见原书 P149)
  • 鸿蒙中Frame分析
  • NLP:Transformer各子模块作用(特别分享1)
  • 网络编程socket-Udp
  • 互联网大厂Java面试模拟:深度解析核心技术
  • 100个实用小工具1.3历年股价分析小工具新增股价批量下载
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
  • 电子厂静电释放检测误报率↓81%!陌讯多模态融合算法在安全生产监控的落地实践
  • imx6ull-驱动开发篇38——Linux INPUT 子系统
  • MATLAB 数值计算进阶:微分方程求解与矩阵运算高效方法
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化
  • WinContig:高效磁盘碎片整理工具
  • 基于蓝牙的stm32智能火灾烟雾报警系统设计
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 访问控制基础与模型综述
  • Python自学笔记11 Numpy的索引和切片
  • Sui 主网升级至 V1.54.2
  • Lucene 与 Elasticsearch:从底层引擎到分布式搜索平台的演进
  • 虚幻引擎5(UE5)Android端游戏开发全流程指南:从环境配置到项目发布
  • Spring Boot测试陷阱:失败测试为何“传染”其他用例?
  • 在PC机上使用虚幻引擎5(UE5)开发第一款游戏的完整入门指南