hooyantsing's Blog

0x000B-BIO、NIO、AIO的区别

2023/08/02

面试回答

同步阻塞BIO:服务器实现模式为 一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理。如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善;

同步非阻塞NIO:服务器实现模式为 一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器 轮询 到某个连接上有IO请求时才启动一个线程进行处理。

异步非阻塞AIO(NIO2):服务器实现模式为 一个有效请求一个线程,即客户端的IO请求都是由操作系统先处理,再 通知 服务器启动线程进行处理。

image-20230810144627233

问题详解

名词解释

  • 同步:Java 自己处理 IO 读写;
  • 异步:Java 将 IO 读写委托给操作系统,操作系统需支持异步读写和提供操作 API;
  • 阻塞:Java 线程一直等待 IO 读写完成才返回;
  • 非阻塞:Java 线程不能读写时立马返回,当 IO 事件分发器通知可读写时再进行读写。

BIO、NIO 和 AIO 区别

BIO NIO AIO
模型 同步阻塞 同步非阻塞 异步非阻塞
包路径 java.io java.nio
核心接口 InputStream/OutputStream字节输入输出流、Reader/Writer字符输入输出流 Buffer缓冲区、Channel管道、Selector选择器
网络编程 Socket、ServerSocket SocketChannel、ServerSocketChannel AsynchronousSocketChannel、AsynchronousServerSocketChannel
应用场景 连接数目比较小且固定的架构。 连接数目多且连接比较短(轻操作)的架构,比如聊天服务器。 连接数目多且连接比较长(重操作)的架构,比如相册服务器。

参考阅读

CATALOG
  1. 1. 面试回答
  2. 2. 问题详解
    1. 2.1. 名词解释
    2. 2.2. BIO、NIO 和 AIO 区别
  3. 3. 参考阅读