IO模型同步异步阻塞非阻塞概念梳理
a调用b
阻塞:a等待b返回结果
非阻塞:a可以立即获取调用b的处理状态
同步:b接收到请求后,在和a的相同的线程中执行任务,完成后返回处理结果。
异步:b接收到请求,会开启其他线程执行任务,执行完成后通知给a
这样理解正确吗?
你的理解非常准确!这是对阻塞 / 非阻塞和同步 / 异步概念的清晰区分,抓住了核心差异。以下是进一步确认和补充:
- 阻塞 vs 非阻塞
阻塞:
A 调用 B 后,A 线程暂停执行,直到 B 返回结果(无论 B 是在当前线程还是其他线程执行)。
关键点:A 线程被挂起,无法处理其他任务。
非阻塞:
A 调用 B 后,A 线程立即继续执行,通过返回值(如状态码、Future)获取 B 的处理状态(如 “处理中”“已完成”)。
关键点:A 线程不等待,可继续执行其他逻辑。 - 同步 vs 异步
同步:
B 的任务在 A 的调用线程内执行,A 需等待 B 完成(可能阻塞或非阻塞,取决于具体实现)。
关键点:B 的执行和 A 的调用在同一个线程中。
异步:
B 的任务在其他线程(如线程池)执行,A 无需等待,通过回调或轮询获取结果。
关键点:B 的执行和 A 的调用在不同线程中。 - 四者组合的典型场景
组合 特点 示例
同步阻塞 A 调用 B,B 在 A 的线程内执行,A 线程阻塞直到 B 完成。 FileInputStream.read()
同步非阻塞 A 调用 B,B 在 A 的线程内执行(可能立即返回状态),A 需轮询结果。 NIO 的 SocketChannel.read()
异步阻塞 A 调用 B,B 在其他线程执行,A 线程阻塞等待异步结果(如 Future.get())。 CompletableFuture.get()
异步非阻塞 A 调用 B,B 在其他线程执行,A 线程继续执行,通过回调获取结果。 CompletableFuture.thenAccept() - 补充说明
同步 ≠ 阻塞:
同步调用可能是阻塞的(如 Thread.join()),也可能是非阻塞的(如轮询 Future.isDone())。
异步 ≠ 非阻塞:
异步调用可能需要主动阻塞获取结果(如 Future.get()),也可能通过回调非阻塞处理结果。
常见误区:
认为 “异步一定比同步快” 是不准确的。异步适用于 I/O 密集型场景(如网络请求),但对于计算密集型任务,过多线程切换反而可能降低性能。
总结
你的理解完全正确!这四个概念的核心区别在于:
阻塞 / 非阻塞:线程是否被挂起;
同步 / 异步:任务是否在调用线程内执行。
掌握这些概念对于设计高性能、高并发的系统至关重要。

浙公网安备 33010602011771号