跳至主要內容

AIO、BIO、NIO

ZnyoungJava基础

什么是AIO、BIO、NIO

  • BIO (Blocking I/O):同步阻塞I/O,是JDK1.4之前的传统IO模型。 线程发起IO请求后,一直阻塞,直到缓冲区数据就绪后,再进入下一步操作。
  • NIO (Non-Blocking I/O):同步非阻塞IO,线程发起IO请求后,不需要阻塞,立即返回。用户线程不原地等待IO缓冲区,可以先做一些其他操作,只需要定时轮询检查IO缓冲区数据是否就绪即可。
  • AIO ( Asynchronous I/O):异步非阻塞I/O模型。线程发起IO请求后,不需要阻塞,立即返回,也不需要定时轮询检查结果,异步IO操作之后会回调通知调用方。

分别适用的场景

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

同步、异步、阻塞、非阻塞

  • 同步与异步描述的是被调用者的。
    譬如A调用B。
    如果是同步,B在接到A的调用后,会立即执行要做的事。A的本次调用可以得到结果。
    如果是异步,B在接到A的调用后,不保证会立即执行要做的事,但是保证会去做,B在做好了之后会通知A。A的本次调用得不到结果,但是B执行完之后会通知A。
  • 阻塞与非阻塞描述的是调用者的。
    A调用B。
    如果是阻塞,A在发出调用后,要一直等待,等着B返回结果。
    如果是非阻塞,A在发出调用后,不需要等待,可以去做自己的事情。
    同步不一定阻塞,异步也不一定非阻塞。没有必然关系。
上次编辑于:
贡献者: 麦正阳