Java BIO、NIO 和 AIO 有什么区别?


1. 问题

  • BIO、NIO 和 AIO 有什么区别?

2. 解答

a. 简述

  • BIO(Blocking I/O,也有人称为 Basic I/O):同步阻塞的 IO,调用某个方法时,该方法没有完成程序不能继续向下执行。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • NIO(Non-blocking I/O,也有人称为 New I/O):同步非阻塞的 IO,调用某个方法时,无论该方法是否完成,程序可以继续向下执行,后期需要自己写代码判断。服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。
  • AIO(Asynchronous I/O): 异步非阻塞的 I/O,调用某个方法时,无论该方法是否完成,程序可以继续向下执行,后期会通过方法回调机制通知。服务器实现模式为一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。

同步与异步

  • 同步(synchronous):一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;
  • 异步(asynchronous):与同步相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系;

阻塞与非阻塞

  • 阻塞(blocking):在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如 ServerSocket 新连接建立完毕,或者数据读取、写入操作完成;
  • 非阻塞(non-blocking):不管 IO 操作是否结束,直接返回,相应操作在后台继续处理;

b. 发展历程

  • BIO:JDK 1.0;
  • NIO:JDK 1.4;
  • AIO:JDK 1.7;

c. 适用场景

  • BIO:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,但程序直观简单易理解。包括了字节流 inputStream/outputStream 和 字符流 reader/writer 以及它们的子类和一些基本的流。
  • NIO:适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。
  • AIO:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂。

I/O 属于底层操作,需要操作系统支持,并发也需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。


推荐阅读:BIONIOAIO >>>

发布了310 篇原创文章 · 获赞 315 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105182635