经典java IO库
- IO是面向流的,NIO是面向缓冲区的
- 对于经典的IO除了Buffered开头的类,其他均没有加缓冲区,除非手动添加缓冲区
byte[] buffer = new byte[64];
inputStream.read(buffer);
- 经典io是标准的同步阻塞模型,即在read的过程中,会阻塞当前线程,直到取完数据。
NIO
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。
IO的模型
-
同步阻塞
同步是对于线程而言的,如果进行IO的操作是当前线程,则为同步的,所以同步阻塞会导致当前线程阻塞,一般来说java中会开一个独立的线程进行同步阻塞的操作,以免程序假死。这是经典模型。
image.png
image.png -
同步非阻塞
同样是在一个线程中,不同的在于调用read()方法后立即返回,不阻塞。到底有没有获取数据,仍然需要我们在当前线程中判断read()的返回值,直到read()到值时再进行其他操作。与同步阻塞相比,阻塞的权限交给了代码编写者,同步阻塞是由jvm进行的阻塞(可能描述不标准),而同步非阻塞,其实还是需要我们在当前线程中轮训是否获取数据了,阻塞权交给了程序员。
image.png
image.png -
IO多路复用
IO多路复用模型使用了Reactor设计模式实现了这一机制。
image.png
image.png -
信号驱动异步I/O模型
image.png -
异步IO
异步IO模型使用了Proactor设计模式实现了这一机制
image.png
image.png
首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。
- 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
- 阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
作者:好好学习312
来源:CSDN
原文:https://blog.csdn.net/u014507083/article/details/73784898
版权声明:本文为博主原创文章,转载请附上博文链接!