概念

Executive Summary

核心观点(金字塔原理)

结论先行: 理解同步/异步与阻塞/非阻塞的本质区别是掌握高并发编程和系统架构设计的基础

支撑论点:

  1. 同步与异步关注的是消息通知机制:同步需要主动等待结果,异步通过回调或事件通知获取结果
  2. 阻塞与非阻塞关注的是等待时的线程状态:阻塞会挂起线程,非阻塞立即返回继续执行
  3. 这两组概念可以组合使用,形成同步阻塞、同步非阻塞、异步阻塞、异步非阻塞四种模式

SWOT 分析

维度 分析
S 优势 概念清晰区分有助于正确选择IO模型和并发编程方案
W 劣势 概念容易混淆,需要结合具体场景深入理解
O 机会 理解这些概念是学习NIO、Netty、Reactor模式等高级技术的前提
T 威胁 概念理解不清可能导致架构设计失误,影响系统性能

适用场景

  • 高并发系统架构设计
  • IO模型选型与优化
  • 网络编程与框架学习

同步 VS 异步 & 阻塞 VS 非阻塞

  • https://www.cnblogs.com/zihe/p/8323585.html
  • https://www.zhihu.com/question/19732473
同步 VS 异步
  • 关注点在于消息通知的机制:调用方如何得知操作结果。
模式 概念描述 举例说明
同步 调用方发起请求后,主动等待结果返回,期间不做其他事 打电话问餐厅有没有位子,一直等对方查完告诉你结果
异步 调用方发起请求后立即返回,结果通过回调、事件或通知机制告知 在餐厅 App 预约,提交后去做别的事,App 推送通知你结果
阻塞 VS 非阻塞
  • 侧重点在于程序(线程)等待消息通知时的状态
模式 概念描述 举例说明
阻塞 调用方在结果返回前被挂起,不能执行其他操作,线程进入等待状态 排队买咖啡,站在柜台前等,什么都不能做
非阻塞 调用方在结果返回前不会被挂起,可以继续执行其他操作,通过轮询或回调获取结果 点完咖啡拿到号码牌,可以去旁边坐着看手机,时不时看一下叫号屏
四种组合模式
组合 描述 IO 模型对应 适用场景
同步阻塞 发起调用后线程挂起等待结果 BIO(java.io 连接数少、编程简单的场景
同步非阻塞 发起调用后立即返回,轮询检查结果 NIO(java.nio 配合轮询) 连接数多但活跃连接少
异步阻塞 异步发起但仍阻塞等待通知(较少见) NIO + Future.get() 需要异步提交但同步等结果
异步非阻塞 异步发起,通过回调/事件获取结果 AIO(AsynchronousChannel)/ Netty 高并发、高吞吐场景
常见误区
  • 同步 ≠ 阻塞:同步强调的是”调用方主动获取结果”,阻塞强调的是”等待时线程被挂起”
  • 非阻塞 ≠ 异步:非阻塞只是不挂起线程(可能需要轮询),异步是结果主动通知
  • Java NIO 是同步非阻塞模型(Selector 多路复用),不是异步模型;Java AIO(NIO2)才是真正的异步模型