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

同步、异步、阻塞、非阻塞的区别

在并发编程和分布式系统中,“同步/异步”与“阻塞/非阻塞”是最易混淆的两对概念。很多人会误以为“同步=阻塞”“异步=非阻塞”,但实际上二者描述的是完全不同的维度——前者针对被调用者,后者针对调用者。本文结合生活化案例和技术场景,一次性讲透它们的核心区别与关联。

一、核心定义:先分清两个维度的主体

要理解这两对概念,首先要明确描述对象

  • 同步/异步:描述的是被调用者的执行逻辑(“做事的方式”);
  • 阻塞/非阻塞:描述的是调用者的等待状态(“等结果的方式”)。

用“A调用B完成任务”的场景具象化:

概念对

描述主体

核心问题

同步/异步

被调用者B

B接到调用后,是否“主动通知”A结果?

阻塞/非阻塞

调用者A

A发出调用后,是否“原地等待”结果?

二、逐个拆解:定义+生活化案例

2.1 同步 vs 异步(被调用者的逻辑)

核心区别:被调用者完成任务后,是否会主动通知调用者。

同步(Synchronous)
  • 定义:B接到A的调用后,立即执行任务,完成后直接返回结果给A(A能直接拿到结果);若任务未完成,A的调用会等待至结果产生。
  • 本质:A的调用与B的执行“同频”,A需通过“查询”或“等待”获取结果。
异步(Asynchronous)
  • 定义:B接到A的调用后,不保证立即执行,但承诺会执行;完成任务后会通过“回调”“通知”等方式主动告知A(A调用时拿不到结果,需等B的通知)。
  • 本质:A的调用与B的执行“异步”,A无需持续关注,等待B的主动反馈即可。

2.2 阻塞 vs 非阻塞(调用者的状态)

核心区别:调用者发出请求后,是否会暂停自身工作等待结果。

阻塞(Blocking)
  • 定义:A发出调用后,暂停所有其他工作,原地等待B返回结果,直到拿到结果才继续做自己的事。
  • 本质:调用者的执行被“卡住”,等待期间无其他产出。
非阻塞(Non-blocking)
  • 定义:A发出调用后,不原地等待,而是继续执行自己的其他任务;之后通过“主动查询”或“被动接收通知”获取结果。
  • 本质:调用者的执行不被阻塞,等待期间可处理其他事务。

三、组合场景:用“老张烧水”讲透4种情况

最经典的生活化案例就是“老张烧水”——老张(调用者A)让水壶(被调用者B)完成“烧水”任务,4种组合场景清晰展现区别:

场景1:同步阻塞(最常见的“傻等”)

  • 过程:老张把普通水壶(无响铃,同步)放上火,站在水壶旁一动不动,直到水烧开才去拿壶。
  • 解析
    • 同步:水壶是“同步”的——水烧开后不会主动通知,需老张自己判断;
    • 阻塞:老张是“阻塞”的——等待期间啥也不做,原地等待结果。
  • 技术对应:Java中Thread.sleep()、普通Socket读取数据——调用后线程暂停,直到任务完成。

场景2:同步非阻塞(“忙等”查询)

  • 过程:老张把普通水壶(同步)放上火,去客厅看电视(不阻塞),每隔5分钟去厨房看一眼水是否烧开。
  • 解析
    • 同步:水壶仍需老张主动查询结果;
    • 非阻塞:老张等待期间做了其他事(看电视),没有原地等待。
  • 技术对应:Java中Socketnon-blocking模式读取数据——线程不会暂停,而是定期检查是否有数据可读,期间可处理其他任务。

场景3:异步阻塞(“等通知但不干活”)

  • 过程:老张把响铃水壶(有响铃,异步)放上火,站在水壶旁一动不动,直到水壶响了(主动通知)才去拿壶。
  • 解析
    • 异步:水壶是“异步”的——水烧开后主动响铃通知,无需老张查询;
    • 阻塞:老张等待期间啥也不做,仅等待通知。
  • 技术对应:Java中Future.get()——提交异步任务后,线程原地等待get()返回结果,期间阻塞。

场景4:异步非阻塞(高效的“通知模式”)

  • 过程:老张把响铃水壶(异步)放上火,直接去客厅看电视(非阻塞),水壶响之前完全不关注,听到铃声(主动通知)再去厨房拿壶。
  • 解析
    • 异步:水壶主动通知结果;
    • 非阻塞:老张等待期间高效处理其他事务。
  • 技术对应:Java中CompletableFuture.thenAccept()、Netty的事件驱动——提交异步任务后线程继续执行,任务完成后通过回调函数通知。

四、关键误区:同步≠阻塞,异步≠非阻塞

很多人混淆的核心是“将两个维度绑定”,但二者完全独立,关键看“主体不同”:

  1. 同步可以非阻塞:如场景2,同步任务(需主动查询)也能让调用者不阻塞;
  2. 异步可以阻塞:如场景3,异步任务(主动通知)也能让调用者原地等待;
  3. 异步非阻塞是高效目标:场景4是分布式系统和并发编程的理想模式——调用者不浪费时间,被调用者主动反馈,资源利用率最高。

五、技术场景落地:不同组合的实际应用

组合模式

技术场景举例

优点

缺点

同步阻塞

普通HTTP请求、简单数据库查询

实现简单,逻辑清晰

资源利用率低,并发差

同步非阻塞

高频查询的缓存访问(如Redis非阻塞客户端)

并发较高,响应快

需频繁查询,有轮询开销

异步阻塞

单线程处理单个异步任务(如Future.get()

逻辑简单,适合单任务

未充分利用并发能力

异步非阻塞

微服务调用(Feign异步调用)、Netty通信

资源利用率最高,并发强

实现复杂,需处理回调

六、总结:记住3个核心结论

  1. 分主体记定义:同步/异步看“被调用者是否主动通知”,阻塞/非阻塞看“调用者是否原地等待”;
  2. 无必然绑定关系:同步≠阻塞,异步≠非阻塞,4种组合均存在实际场景;
  3. 高效目标明确:异步非阻塞是分布式和高并发场景的最优解,通过“主动通知+非等待”最大化资源利用率。

理解这两对概念,是掌握并发编程(如Java并发、Go协程)和分布式系统(如微服务调用、消息队列)的基础——后续再遇到“异步回调”“非阻塞IO”等概念,先分清“描述的是调用者还是被调用者”,就不会再混淆了!

http://www.dtcms.com/a/540719.html

相关文章:

  • 网站建设技术培训电商基地推广
  • 使用注解将日志存入Elasticsearch
  • 【STM32】WDG看门狗
  • 无锡市建设安全监督网站全国统一核酸检测价格
  • 做网站购买备案域名织梦高端html5网站建设工作室网络公司网站模板
  • 2.CSS3.(4).html
  • 记一次诡异的“偶发 404”排查:CDN 回源到 OSS 导致 REST API 失败
  • C++笔记(面向对象)类模板
  • Selenium IDE下载和安装教程(附安装包)
  • Quartz框架实现根据设置的cron表达式进行定时任务执行
  • linux20 线程同步--信号量
  • 内核的文件预取逻辑及blockdev的相关配置
  • [特殊字符] Web 字体裁剪优化实践:把 42MB 字体包瘦到 1.6MB
  • 平滑过渡,破解多库并存:浙人医基于金仓KFS的医疗信创实战解析
  • 做经营性的网站需要注册什么条件网站构思
  • Answer企业社区实战:零成本搭建技术问答平台,远程协作效率提升300%!
  • “听书”比“看书”更省力?
  • 大连 手机网站案例网站定位方案
  • window安装MYSQL5.5出错:a windows service with the name MYSQL alreadyexists....
  • 珠海做网站报价影响网站排名的因素
  • 6.1.2.2 大数据方法论与实践指南-离线任务SQL 任务开发规范
  • Java 大视界 -- Java 大数据在智能交通高速公路收费系统优化与通行效率提升实战(429)
  • 网站可以做怀孕单吗平面设计图数字标识
  • 图神经网络入门:手写一个 VanillaGNN-从邻接矩阵理解图神经网络的消息传递
  • 网站模版带后台酒类招商网站大全
  • 营销型网站创建网页制作三剑客通常指
  • 【笔试真题】- 电信-2025.10.11
  • 云渲染与传统渲染:核心差异与适用场景分析
  • 什么是流程监控?如何构建跨系统BPM的实时监控体系?
  • 直通滤波....