面试回答
同步阻塞BIO:服务器实现模式为 一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理。如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善;
同步非阻塞NIO:服务器实现模式为 一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器 轮询 到某个连接上有IO请求时才启动一个线程进行处理。
异步非阻塞AIO(NIO2):服务器实现模式为 一个有效请求一个线程,即客户端的IO请求都是由操作系统先处理,再 通知 服务器启动线程进行处理。
问题详解
名词解释
- 同步: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 |
应用场景 | 连接数目比较小且固定的架构。 | 连接数目多且连接比较短(轻操作)的架构,比如聊天服务器。 | 连接数目多且连接比较长(重操作)的架构,比如相册服务器。 |