概念
2020-10-11
1 min read
Architecture
Executive Summary
核心观点(金字塔原理)
结论先行: 理解同步/异步与阻塞/非阻塞的本质区别是掌握高并发编程和系统架构设计的基础
支撑论点:
- 同步与异步关注的是消息通知机制:同步需要主动等待结果,异步通过回调或事件通知获取结果
- 阻塞与非阻塞关注的是等待时的线程状态:阻塞会挂起线程,非阻塞立即返回继续执行
- 这两组概念可以组合使用,形成同步阻塞、同步非阻塞、异步阻塞、异步非阻塞四种模式
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)才是真正的异步模型