一、什么是IO/NIO:

  IO:即BIO(Blocking IO);面向流的、同步阻塞式IO;(JDK1.4之前唯一的选择)

  NIO:面向缓冲的、同步非阻塞式IO;三大核心部分:Selector、Channel(通道)、Buffer(缓冲区);(JDK1.4引进的,一般网络编程中用得较多)

  AIO:异步非阻塞式IO;(JDK1.7引进,算较新的特性)

二、同步、异步、阻塞、非阻塞(分布式系统角度理解,较抽象):

  同步异步 和 阻塞非阻塞并没有直接的关系。

  

  同异步描述的是一种"消息机制";比如两个线程A,B,线程A请求线程B需要一些数据,然后B去给A拿数据去:(主被动关系)

    1:同步机制下,线程A要定时去主动的问A数据拿来没有。

    2:异步机制下,线程A请求完B,就不管了,B如果把数据拿来准备好了,由B来通知A来处理。

  

  阻塞非阻塞:描述的是线程间请求时所处的一种状态:(能不能去做别的事)

    1:阻塞:体现在A请求B,一直到到读取数据B的过程中,A线程被挂起(期间不能使用CPU),直到当前数据段获取完了。(一次while()的执行)。

    2:非阻塞:体现在A请求到获取数据之间,A线程不会被挂起,从请求到准备好数据这个阶段,A可以离开去做其它事。

  注:同步异步,一般我们从编程中的多线程的角度理解是:同步强调线程间的时序关系,A要在B完成后才能继续。异步则是指AB两个分工完成部分任务,两者无需关心前后完成的关系。

       

三、组合:

  同步阻塞:Java传统的IO就是 同步阻塞,A请求B拿数据,然后A之后需要主动去询问B是否准备好了,到B准备好了数据并且A获取到了数据期间,A不能干别的事,直到A获取完数据。

  同步非阻塞:Java中的NIO就是 同步非阻塞,A需要主动去询问B是否准备好了,与同步阻塞的区别在于,A询问B之间A可以不阻塞,A可以去做别的事。

  异步阻塞:A请求B拿数据,然后A不需要主动去询问B是否准备好了,到B准备好了数据会通知A来获取,因为也是阻塞,A也不能干别的事,直到A获取完数据。(理论是这样,但现实中这样的应用应该不多。。)

  异步非阻塞:Java中的AIO就是 异步非阻塞,A请求B拿数据,然后A不需要主动去询问B是否准备好了,到B准备好了数据会通知A来获取,因为是非阻塞,A第一次请求B去拿数据后,A可以去做别的了。

四:Java nio的好处(同步非阻塞):

  整体结构使用了反应器的设计模式(Reactor):

  参考:Reactor模式详解

  

  在实际使用中,Java NIO的优点主要体现在高并发时,其中Selector充当请求和询问者的角色,Selector会和多个Channel绑定,询问哪个Channel准备好了,如果有监听到需要的事件,就执行对应的操作。

之前提到的 非阻塞时做别的事,在这里可以理解为Selector去询问完当前的Channel,它这时可以去询问其它的Channel,而不用守在一个Channel前直到处理完这个Channel的数据。

五、编程中的while()方法与阻塞:

  阻塞与否不是体现在这里的while()方法,在while()执行时其它已经说明请求已经准备好了;

  阻塞是体现在第一次讲求读取数据并执行IO中的read()\write()方法的过程,这个过程中线程A不能做别的事。

  执行while()的日的是为了读取完想要的数据,while()执行了多少次,阻塞就发生了多少次。

可参考:

  怎样理解阻塞非阻塞与同步异步的区别?(知乎第一个严肃答案)

  同步阻塞、同步非阻塞、异步阻塞、异步非阻塞(知乎第二个郭无心答案)

  结合原理图理解

  并发网NIO系列详解

Java IO、BIO、NIO、BIO的更多相关文章

  1. [转帖]JAVA BIO与NIO、AIO的区别(这个容易理解)

    JAVA BIO与NIO.AIO的区别(这个容易理解) https://blog.csdn.net/ty497122758/article/details/78979302 2018-01-05 11 ...

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

    转自:http://blog.csdn.net/skiof007/article/details/52873421 BIO与NIO.AIO的区别(这个容易理解) IO的方式通常分为几种,同步阻塞的BI ...

  3. JAVA BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  4. 【转】JAVA BIO与NIO、AIO的区别

    Java中IO的模型分为三种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. BIO[同步阻塞] 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个Ser ...

  5. BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO      在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个Serve ...

  6. [转帖] BIO与NIO、AIO的区别

    培训里面讲的东西  自己查了下 啥意思,,, 转帖强化一下. http://blog.csdn.net/skiof007/article/details/52873421 IO的方式通常分为几种,同步 ...

  7. BIO与NIO、AIO的区别(转)

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  8. 【1】BIO与NIO、AIO的区别

    一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求 ...

  9. java.io中的System.in、 System.out和System.err

    System.in, System.out, System.err这3个流同样是常见的数据来源和数据流目的地.使用最多的可能是在控制台程序里利用System.out将输出打印到控制台上. JVM启动的 ...

  10. java io 处理流,BufferdInputStream、BufferedWriter、BufferedReader

    BufferdInputStream:读取helloworld.java helloworld.java: package io; public class HelloWorld { public s ...

随机推荐

  1. 【DFS求树的最大二分匹配+输入外挂】HDU 6178 Monkeys

    http://acm.hdu.edu.cn/showproblem.php?pid=6178 [题意] 给定一棵有n个结点的树,现在有k个猴子分布在k个结点上,我们可以删去树上的一些边,使得k个猴子每 ...

  2. vector容器中添加和删除元素

    添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入 ...

  3. Linux(10):期中架构(2)--- NFS存储服务 & 实时同步

    1. 共享存储服务概念: # NFS是Network File System的缩写,中文意思是网络文件系统, # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. 2. ...

  4. Codeforces956D. Contact ATC

    $n \leq 100000$个飞机在坐标轴上,给坐标给速度,坐标速度异号,还有一个风速在$[-w,w]$区间,$w$比最小的速度绝对值要小.由于风速不知道,所以问有多少对飞机可能在原点相遇. 思维定 ...

  5. [C/C++] 结构体内存对齐用法

    一.为什么要内存对齐 经过内存对齐之后,CPU的内存访问速度大大提升; 内存空间按照byte划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内 ...

  6. 程序包com.sun.image.codec.jpeg不存在解决方法

    https://blog.csdn.net/u011627980/article/details/50436842

  7. Sql server 各版本下载链接

    Sql Server 2008 R2 链接: https://pan.baidu.com/s/11WPcrUL64QT0zT0_9VTb8Q 提取码: 665l 密钥:JD8Y6-MQG69-P9M8 ...

  8. Ubuntu 16.04安装CrossOver容器来安装QQ(终极解决办法,亲测有效)

    说明:此版本的QQ基本完美,但是有个缺点就是历史记录有些会显示乱码! 注意:此方法能完美解决这篇文章http://www.cnblogs.com/EasonJim/p/7118693.html的所有问 ...

  9. Spring中使用byName实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html: 此 ...

  10. 一个球,初始高度100,每次落下回弹一半高度,求第n次落下球走的距离

    def get_height(n): if n==1: eturn 150 return 100+sum([200*pow(0.5,i) for i in range(1,n)])+100*pow(0 ...