参考答案
一、BIO、NIO、AIO的区别
1. BIO
- 是一个连接一个线程。
- 发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。
- 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
2.NIO
- 是一个请求一个线程。
- 客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。
- 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
3. AIO
- 是一个有效请求一个线程。
- 线程发起 IO 请求,立即返回;内存做好 IO 操作的准备之后,做 IO 操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做 IO 操作完成或者失败。
- 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的 IO 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。
二、适用场景分析
1. BIO
适用于连接数目比较小且固定的架构,对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序直观简单易理解。
2. NIO
适用于连接数目多且连接比较短(轻操作)的架构,例如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
3. AIO
使用于连接数目多且连接比较长(重操作)的架构,例如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
例如:
- 同步阻塞:你到饭馆就餐,排队的人很多,你在那儿等着,什么都不能干,但是你必须等着。
- 同步非阻塞:你到饭馆就餐,点好了就回家了。过了一会儿,你回饭馆问一声,到我了没?
- 异步非阻塞:饭馆打电话说,我们知道你的位置,一会就给你送过来,你安心在家等就可以了,类似于外卖。
以上,是Java面试题【BIO、NIO、AIO有什么区别】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—