1:写在前面

一般来说获取数据需要几步呢,正常的理解是2步,第一步干嘛呢?先问下有没有数据,如果有数据的话再进行第二步,那么第二步自然就是取数据了,对于io来说,其中的第一个步骤是select,第二个步骤是read,好的,我们就以这两个步骤来开始分析常见的IO模型吧!

2:select和read齐全

在io模型中,使用到这两个步骤的目前只有IO多路复用,第一步骤的select操作可以直接查询多个数据通道的数据情况,如果有某些数据通道已有数据,然后进入第二步骤read,直接去读数据,那么这里多路复用中的多路就体现在第一步骤的select操作是直接查询多个数据通道的。这个过程可以参考下图:
讨论下常见的IO模型

3:只有read

关于这里,需要先简答说明下什么是同步,什么是阻塞,这样才能更好的理解同步阻塞同步非阻塞等概念。
先说同步,同步呢是相对于read的发起和数据的返回是否是在同一个步骤中,换句话说就是数据是否是通过read操作获取的,如果是则是同步,否则是异步(通过read只是注册回调而不读取数据)这里其实就分为了两种情况,第一种是read操作就是来读取数据的,第二种是read操作只是来注册一个数据回调,而不进行实际的数据读取操作,从这两个维度来划分,如果是第一种read操作就是来读取数据的则就是同步,如果是第二种read操作只是进行注册而不读取数据就是异步的。然后其中的第一种情况又可以分为两种情况,第一种是如果是read没有数据一致等待就是阻塞,没有数据直接返回错误就是非阻塞。如下:
讨论下常见的IO模型

3.1:read没有数据一直等待

首先read是用来读取数据的,则是同步,然后没有数据的时候就一直等待,则是阻塞,因此这种就是同步阻塞IO。这个过程如下图:
讨论下常见的IO模型

3.2:read没有数据直接返回

首先read是来读取数据的,则是同步,没有数据直接返回,则是非阻塞,因此这种方式是同步非阻塞的,这个过程如下图:
讨论下常见的IO模型

3.3:read不读取数据用来注册回调

首先read不读取数据,则是异步,因此这种方式的io就是异步io,这个过程如下图:
讨论下常见的IO模型

3:java中都实现了哪些IO模型

java中提供的有IO,NIO,NIO2(AIO),其中IO是同步阻塞的IO模型,NIO是多路复用IO模型,NIO2(AIO)是异步IO模型。这里其中的NIO在netty框架中得到了广泛的应用。

最后:都让开,我要喝瑞幸

讨论下常见的IO模型

相关文章:

  • 2021-06-29
  • 2021-08-28
  • 2022-01-11
  • 2022-02-16
  • 2021-06-14
猜你喜欢
  • 2021-07-07
  • 2021-09-23
  • 2021-09-21
  • 2021-11-29
  • 2021-04-20
  • 2021-12-29
相关资源
相似解决方案