Java面试|BIO、NIO、AIO的区别和应用场景

摘要:BIO是一个连接一个线程,NIO是一个请求一个线程,AIO是一个有效请求一个线程。

  在学习Java I/O类库时,容易混淆NIO、BIO、AIO这几个概念,同时对于阻塞和非阻塞、同步和异步的理解也较为晦涩,这篇文章是对这几个概念的一些区分以及个人的一些见解。

BIO

  Blocking I/O,同步阻塞I/O模型,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。应用场景:适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在JDK 1.4以前是唯一的I/O实现,但程序直观简单易理解。

  通俗理解为数据的读取写入必修阻塞在一个线程内,直到其完成。

NIO

  New I/O,同步非阻塞I/O模型,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。应用场景:NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK 1.4开始支持。

  是传统I/O的升级版,客户端和服务端通过Channel(通道)通讯,实现了多路复用。

NIO采用的是一种多路复用的机制,利用单线程轮询事件,高效定位就绪的Channel来决定做什么,只是Select阶段是阻塞式的,能有效避免大量连接数时,频繁线程的切换带来的性能或各种问题。

AIO

  Asynchronous I/O,异步非阻塞I/O模型,服务器实现模式为一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用启动线程进行处理。 应用场景:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK 7 开始支持。

IO与NIO区别

  IO面向流,NIO面向缓冲区;IO的各种流是阻塞I/O模型,NIO是非阻塞I/O模型。

  NIO的选择允许一个单独的线程来监视多个输入通道,可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入或选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

小结

  Java 中的 BIO、NIO和 AIO 是 Java 语言对操作系统中各种 I/O 模型的封装。我们在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码,只需要调用Java的API就足矣!

  以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作具有一定的参考和学习价值;如果有疑问,大家可以在评论区留言交流,也希望大家多多点赞关注。谢谢大家对楼兰胡杨的支持!

Reference

上一篇:3.Innodb体系架构之后台进程


下一篇:网络IO模型(BIO,NIO,AIO)