文档章节

网络IO编程BIO、NIO、AIO区别

Clarence_D
 Clarence_D
发布于 2017/05/17 11:25
字数 856
阅读 102
收藏 2

    在网上查了很多资料,自己整理下便于自己去理解,那里整理的不好还望告知。IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

概念

    BIO是一个连接一个线程。

    NIO是一个请求一个线程。

    AIO是一个有效请求一个线程。

    同步和异步是目的,阻塞和非阻塞是实现方式。

  • 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写);
  • 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API);
  • 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);
  • 非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)

各种I/O的对比

    先以一张表来直观的对比一下:

    

Java对BIO、NIO、AIO的支持:

  • Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

BIO、NIO、AIO适用场景分析:

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

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

© 著作权归作者所有

共有 人打赏支持
Clarence_D
粉丝 9
博文 129
码字总数 103146
作品 0
天津
程序员
私信 提问
Java IO: BIO, NIO, AIO(含代码实现)

BIO, NIO, AIO,本身的描述都是在Java语言的基础上的。 而描述IO,我们需要从三个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO, NIO, AIO以Java的角度理解: BIO,同步阻塞式IO,简...

tantexian
2016/05/11
385
0
浅谈“阻塞同步”,“BIO、NIO、AIO”

一、阻塞?同步? 可能大家平常会经常听到这两个名词,但是没花太多心思详细了解,今天就来揭开这层面纱。 一次IO操作,以read方法举例,会经历两个阶段: (1)等待数据准备(Waitingfor the...

叫我宫城大人
2017/09/04
0
0
Java面试基础篇——第九篇:BIO,NIO,AIO的区别

现在IO模型主要分三类:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。先来看看BIO。 1. BIO 服务端接受到请求后,要指派或新建一个线程去处理客户端的IO请求,直到收到断开连接的指令。这么做的...

developlee的潇洒人生
07/23
0
0
Java IO: BIO, NIO, AIO

BIO, NIO, AIO,本身的描述都是在Java语言的基础上的。而描述IO,我们需要从三个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO, NIO, AIO以Java的角度理解: BIO,同步阻塞式IO,简...

丢失的羊羔
2015/12/29
314
2
闲谈Tomcat性能优化

Tomcat在各位JavaWeb从业者常常就是默认的开发环境,但是Tomcat的默认配置作为生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈. 幸好Tomcat还有很多的提升空间.下文介绍一下...

ParkJun
2016/02/23
2.3K
13

没有更多内容

加载失败,请刷新页面

加载更多

BitMap的JAVA实现

相关概念 基础类型 在java中: byte -> 8 bits -->1字节char -> 16 bit -->2字节short -> 16 bits -->2字节int -> 32 bits -->4字节float -> 32 bits -->4字节long ->......

freeli
22分钟前
1
0
如何实现前端微服务化

摘要: fundebug-cli是Fudnebug的命令行工具,可以用于批量上传Source Map文件。 Fundebug支持使用Source Map还原真正的错误位置。这样的话,开发者能够迅速定位出错的源代码。另外,Fundebu...

Fundebug
33分钟前
0
0
spring boot jdbc

TODO

zzx10
35分钟前
1
0
var 是 Java 开发的好朋友啊!

简评:Java var != JavaScript var。 Java 10 中引入了新的语法用于局部变量类型推断,很多开发者有所疑惑,希望这篇文章能帮到你。 什么是类型推断 其实在 Java 中类型推断早就存在了,看下...

极光推送
39分钟前
0
0
进阶的Redis之Sentinel原理及实战

Redis作为一款高效的内存数据库,可作用于方方面面,相信如今项目的开发都离不开它。大家可能都知道Redis是高可用的,但很少知道具体高可用是利用什么去实现的。 抛两个问题: 只部署一个Red...

公众号_Zack说码
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部