面试常问:BIO、NIO、AIO

1.BIO、NIO、AIO定义

Java共支持3种网络编程模型IO模式

  • BIO:(blocking io)同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器就要启动一个线程进行处理,如果这个链接不做任何事,就容易造成不必要的线程开销。可以用线程池改善实现多用户访问一个服务器即实现并发
  • NIO:(non blocking io 或 new io)异步非阻塞,服务器是羡慕时为一个线程处理多个连接请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器查询到有连接IO请求就返回处理。
    NIO 相关类都被放在Java.nio包以及子包下,并且对原Java.io包中的很多类进行改写。
    NIO是面向缓冲区(缓冲区其实就对应了一个内存块)、或者说面向块编程的。数据读到一个缓冲区进行稍后处理,这样就增加了处理过程中的灵活性。
  • AIO:异步非阻塞:AIO引入了异步通道的概念,简化了程序编写,有效的请求才启动线程,它的特点是由操作系统完成后,才通知服务器启动线程去处理,一般用于连接数比较多且连接时间较长的应用。
    注:

2.BIO、NIO、AIO使用场景

  • BIO:适用于链接数目较小且固定的架构,JDK1.4以前唯一的选择。
  • NIO:适用于连接数目多且连接比较短的的架构,如聊天服务器,弹幕等,编程比较复杂JDK1.4开始支持。
  • AIO: 适用于连接数目多且连接比较长的的架构,编程比较复杂JDK1.7开始支持。
    面试常问:BIO、NIO、AIO

3. NIO 有3大核心部分:channel、buffer、selector

  • 一个thread对应一个selector,由selector根据根据不同的事件,在各个通道(channel)上切换。
  • 一个selector上注册多个channel
  • 一个channel对应一个buffer
  • buffer就是一个内存块,底层是有一个数组,数据的读写是通过buffer,你的buffer是双向的可以读也可以写,需要flip切换而在BIO中要么是输入流要么是输出流,不能双向.

4.NIO和BIO的区别

面试常问:BIO、NIO、AIO