这里建议不太清楚这个三个概念的可以看我的这篇文章,通俗易懂http://blog.csdn.net/sky_100/article/details/77603576
一、BIO
在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。

二、NIO
NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性:
1.NIO是基于块(Block)的,它以块为基本单位处理数据 (硬盘上存储的单位也是按Block来存储,这样性能上比基于流的方式要好一些)
2.为所有的原始类型提供(Buffer)缓存支持
3.增加通道(Channel)对象,作为新的原始 I/O 抽象
4.支持锁(我们在平时使用时经常能看到会出现一些.lock的文件,这说明有线程正在使用这把锁,当线程释放锁时,会把这个文件删除掉,这样其他线程才能继续拿到这把锁)和内存映射文件的文件访问接口
5.提供了基于Selector的异步网络I/O

所有的从通道中的读写操作,都要经过Buffer,而通道就是io的抽象,通道的另一端就是操纵的文件。
NIO有一个很大的特点就是:把数据准备好了再通知我
而Channel有点类似于流,一个Channel可以和文件或者网络Socket对应 。

selector是一个选择器,它可以选择某一个Channel,然后做些事情。
一个线程可以对应一个selector,而一个selector可以轮询多个Channel,而每个Channel对应了一个Socket。
与上面一个线程对应一个Socket相比,使用NIO后,一个线程可以轮询多个Socket。
当selector调用select()时,会查看是否有客户端准备好了数据。当没有数据被准备好时,select()会阻塞。平时都说NIO是非阻塞的,但是如果没有数据被准备好还是会有阻塞现象。
当有数据被准备好时,调用完select()后,会返回一个SelectionKey,SelectionKey表示在某个selector上的某个Channel的数据已经被准备好了。
只有在数据准备好时,这个Channel才会被选择。
这样NIO实现了一个线程来监控多个客户端。
总结:

  1. NIO会将数据准备好后,再交由应用进行处理,数据的读取/写入过程依然在应用线程中完成,只是将等待的时间剥离到单独的线程中去。
  2. 节省数据准备时间(因为Selector可以复用)

三、 AIO
AIO的特点:

  1. 读完了再通知我
  2. 不会加快IO,只是在读完后进行通知
  3. 使用回调函数,进行业务处理
    在理解了NIO的基础上,看AIO,区别在于AIO是等读写过程完成后再去调用回调函数。
    NIO是同步非阻塞的
    AIO是异步非阻塞的
    由于NIO的读写过程依然在应用线程里完成,所以对于那些读写过程时间长的,NIO就不太适合。
    而AIO的读写过程完成后才被通知,所以AIO能够胜任那些重量级,读写过程长的任务。

自己对JavaNIO的一个理解:
NIO最大的优点就是非阻塞嘛,而非阻塞是对于客户端而言的,就是调用读/写方法后,是否能立即返回,能立即返回则是非阻塞,不能立即返回则是阻塞。NIO的非阻塞在于如果有数据,则返回给用户;无则直接返回0,永远不会阻塞。
而IO多路复用的Selector,则是服务端对线程资源的优化。以前一个socket请求就得对应一个服务端的线程去处理,极大浪费服务端线程资源,现在用IO多路复用技术,只需要一个线程就能管理多个socket请求,减少了服务端线程使用数量。
BIO里用户最关心“我要读”,NIO里用户最关心”我可以读了”,在AIO模型里用户更需要关注的是“读完了”。

Linux 5种IO模型:

1到4都是同步的,信号驱动为啥是同步的,因为当操作系统准备好数据后,需要用户线程将数据从内核复制到用户空间。
https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw==&mid=2247484746&idx=1&sn=c0a7f9129d780786cabfcac0a8aa6bb7&source=41#wechat_redirect

IO 多路复用是5种I/O模型中的第3种,对各种模型讲个故事,描述下区别:
故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。
1.阻塞I/O模型
老李去火车站买票,排队三天买到一张退票。
耗费:在车站吃喝拉撒睡 3天,其他事一件没干。
2.非阻塞I/O模型
老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。
耗费:往返车站6次,路上6小时,其他时间做了好多事。
3.I/O复用模型
1.select/poll
老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。
耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次
2.epoll
老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。
耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话
4.信号驱动I/O模型
老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。
耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话
5.异步I/O模型
老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。
耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话
1同2的区别是:自己轮询
2同3的区别是:委托黄牛
3同4的区别是:电话代替黄牛
4同5的区别是:电话通知是自取还是送票上门

参考文章:
http://www.jb51.net/article/92448.htm
https://tech.meituan.com/2016/11/04/nio.html

Java中BIO,NIO,AIO相关推荐

  1. IO之 java中BIO NIO AIO原理、区别以及应用

    在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...

  2. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? ...

  3. Java中BIO,NIO,AIO的理解

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步?  2 什么是异步?  3 什么是阻塞?  4 什么是非阻塞?  5 什么是同步阻塞?  6 什么是同步非 ...

  4. JAVA IO : BIO NIO AIO

    JAVA IO : BIO NIO AIO 同步异步.阻塞非阻塞概念 同步与异步 阻塞与非阻塞 IO VS NIO VS AIO 面向流与面向缓冲 阻塞与非阻塞IO BIO.NIO.AIO的JAVA实 ...

  5. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

  6. java io bio nio aio 详解

    BIO.NIO.AIO的区别: BIO就是基于Thread per Request的传统server/client实现模式, NIO通常采用Reactor模式, AIO通常采用Proactor模式, ...

  7. Java之BIO NIO AIO区别联系

    1F 说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, ...

  8. bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解

    java 的 IO 演进之路 我们在前面学习了 linux 的 5 种 I/O 模型详解 下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程. ...

  9. 常见的 IO 模型有哪些?Java 中 BIO、NIO、AIO 的区别?

    IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...

最新文章

  1. 分享 10 道 Nodejs 进程相关面试题
  2. Educational Codeforces Round 12 C. Simple Strings 贪心
  3. .net MVC 简单图片上传
  4. java监控rabbitMq服务状态,spring cloud 的监控turbine-rabbitmq的示例
  5. spring(四):spring与mybatis结合
  6. pytorch卷积模型定义
  7. 创维酷开电视能换成android系统吗,创维酷开电视怎么系统升级【图文教程】
  8. 读写分离_摸手教程基于ShardingSphereJDBC的MySQL读写分离
  9. php字游戏源码,php文字游戏寻仙纪.zip
  10. 中职 计算机 教案,中职计算机基础教案.doc
  11. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)
  12. 【VBA】通过VBA实现EXCEL真正的全屏显示
  13. hdu4114.Disney's FastPass
  14. 混响(Reverb)/空间音效(Panning)
  15. 教你使用html+js手绘一个时钟
  16. OBS无图像(黑屏)的终极解决办法(含切换集显无效办法)
  17. 电脑安装双系统(win+Linux)的一些重要步骤总结
  18. java中talent-aio_通讯框架:talent-aio实例
  19. 一、网上商城推荐系统
  20. android twerk,抖音薛老湿bgm手机铃声响起拍照是什么歌 Android Twerk在哪听

热门文章

  1. 2022年中国科学技术大学细胞生物III复习资料
  2. 大一大学计算机导论论文,大学计算机导论论文3500字_大学计算机导论毕业论文范文模板.doc...
  3. Java中 9 种常见的 CMS GC 问题分析与解决
  4. Java按钮监听器ActionListener 事件监听教程.
  5. elementUI 选择器 html
  6. 【Mini KITTI】KITTI数据集简介 — Mini KITTI
  7. 我的ubuntu8.04安装经验
  8. 浅谈二叉搜索树(BST)
  9. 在前端中清除IE浏览器缓存问题
  10. android 深度自定义View