标准答案
- 同步调用要求调用方等待结果或主动获取结果;异步调用把完成通知交给回调、Future、事件或消息。
- 阻塞表示当前线程或协程在操作完成前不能继续执行;非阻塞表示调用立即返回,稍后通过事件或轮询取得结果。
- 一个接口可以是同步非阻塞的,例如立即返回一个可查询句柄;也可以是异步但内部使用阻塞线程池。
- 判断时要说明等待发生在哪里、资源是否被占用、错误如何传播和取消如何生效。
题目解析
同步/异步描述调用方如何获得结果,阻塞/非阻塞描述当前执行单元是否被迫等待。它们可以交叉组合,不能用一个维度的词替代另一个维度的判断。
异步接口通常把等待转移到 Future、回调、事件或任务状态中,整体工作量并没有消失。真正的收益是执行资源可以在等待期间服务其他工作,但前提是底层调用确实能让出执行权。
回答一个服务是否“异步”时,还要补充错误传播、取消、超时和结果查询方式。否则只是描述 API 外形,无法说明故障时请求会不会继续制造副作用。
常见误区
- 误区:认为 async 关键字会自动让所有下游非阻塞。改正:检查数据库、文件和网络库的实现,必要时把阻塞调用放进有界专用执行器。
- 误区:把同步 API 和阻塞 API 当成反义词。改正:分别说明结果通知方式和执行单元是否等待,两个维度可以独立存在。
- 误区:异步提交后没有结果和失败查询。改正:定义任务状态、超时、取消和重试边界,让调用方能够确认最终业务结果。