1:写在前面
一般来说获取数据需要几步呢,正常的理解是2步,第一步干嘛呢?先问下有没有数据,如果有数据的话再进行第二步,那么第二步自然就是取数据了,对于io来说,其中的第一个步骤是select,第二个步骤是read,好的,我们就以这两个步骤来开始分析常见的IO模型吧!
2:select和read齐全
在io模型中,使用到这两个步骤的目前只有IO多路复用,第一步骤的select操作可以直接查询多个数据通道的数据情况,如果有某些数据通道已有数据,然后进入第二步骤read,直接去读数据,那么这里多路复用中的多路就体现在第一步骤的select操作是直接查询多个数据通道的。这个过程可以参考下图:
3:只有read
关于这里,需要先简答说明下什么是同步,什么是阻塞,这样才能更好的理解同步阻塞,同步非阻塞等概念。
先说同步,同步呢是相对于read的发起和数据的返回是否是在同一个步骤中,换句话说就是数据是否是通过read操作获取的,如果是则是同步,否则是异步(通过read只是注册回调而不读取数据)这里其实就分为了两种情况,第一种是read操作就是来读取数据的,第二种是read操作只是来注册一个数据回调,而不进行实际的数据读取操作,从这两个维度来划分,如果是第一种read操作就是来读取数据的则就是同步,如果是第二种read操作只是进行注册而不读取数据就是异步的。然后其中的第一种情况又可以分为两种情况,第一种是如果是read没有数据一致等待就是阻塞,没有数据直接返回错误就是非阻塞。如下:
3.1:read没有数据一直等待
首先read是用来读取数据的,则是同步,然后没有数据的时候就一直等待,则是阻塞,因此这种就是同步阻塞IO。这个过程如下图:
3.2:read没有数据直接返回
首先read是来读取数据的,则是同步,没有数据直接返回,则是非阻塞,因此这种方式是同步非阻塞的,这个过程如下图:
3.3:read不读取数据用来注册回调
首先read不读取数据,则是异步,因此这种方式的io就是异步io,这个过程如下图:
3:java中都实现了哪些IO模型
java中提供的有IO,NIO,NIO2(AIO),其中IO是同步阻塞的IO模型,NIO是多路复用IO模型,NIO2(AIO)是异步IO模型。这里其中的NIO在netty框架中得到了广泛的应用。