Java中的BIO,NIO,AIO

1. 理解同步/异步、阻塞/非阻塞

  • 同步和异步是针对应用程序和内核的交互而言的:

    • 同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。

    • 异步:用户进程触发IO操作以后便开始做自己的事情(实际上是委托给操作系统来进行处理),而当IO操作已经就绪的时候会得到系统的通知。

  • 阻塞和非阻塞是针对于进程在进行IO操作的时候,是否需要等待完成:

    • 阻塞:读取或者写入函数将一直等待。

    • 非阻塞:读取或者写入函数会立即返回一个状态值。

2. Java中的BIO,NIO,AIO分别是什么,应用场景是什么?

BIO

  • 概念:同步阻塞式IO,服务器端与客户端三次握手建立连接后,一个请求链路创建一个线程进行面向流的通信

  • 特点:

    • 面向流

    • 一个请求对应一个线程

    • 在任何一端出现网络性能问题时都影响另一端,无法满足高并发高性能的需求

    • 如果这个连接不做任何事情时,会造成不必要的线程开销,可以使用线程池进行改善

  • 应用场景:BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解

NIO

  • 概念:同步非阻塞式IO,基于事件驱动的思想来实现了一个多路复用器,多路复用Reactor模式,当多路复用器轮询到有I/O请求时才启动一个线程进行处理

  • 特点:

    • 面向缓冲区

    • 多个请求对应一个或者少量线程

    • 读写过程是同步的,线程会等待。所以对于那些读写过程时间长的(例如有JDBC操作),NIO就不太适合。

  • 应用场景:NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持

AIO

  • 概念:异步非阻塞IO,基于unix事件驱动,不需要多路复用器对注册通道进行轮询,采用Proactor设计模式。当IO就绪后会收到操作系统的通知

  • 特点:

    • 一个有效请求对应一个线程

    • 当IO就绪后会收到操作系统的通知,线程不必等待。所以AIO能够胜任那些重量级,读写过程长的任务。

  • 应用场景:AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持

参考文章

BIO与NIO、AIO的区别(这个容易理解)

深入分析 Java I/O 的工作机制

Java NIO 系列教程

Java NIO原理图文分析及代码实现

posted @ 2020-09-20 19:30  qxwang  阅读(39)  评论(0)    收藏  举报