JAVA中IO同步、异步、阻塞、非阻塞

xiaoxiao2021-02-28  102

转载自http://stevex.blog.51cto.com/4300375/1284437

一、同步与异步

同步和异步是针对应用程序和内核的交互而言的。

同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪;

而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。

二、阻塞和非阻塞

阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式。

阻塞方式下读取或者写入函数将一直等待;

而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 

所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。

三、同步阻塞(BIO)、同步非阻塞(NIO)、异步非阻塞(AIO)

1.同步阻塞BIO

在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。

JAVA传统的IO模型属于此种方式。 适用于并发量要求不高的场景。

2.同步非阻塞NIO

在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。

其中目前JAVA的NIO就属于同步非阻塞IO。 适用于并发量要求比较高的场景。

3.异步非阻塞AIO

此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。

发展还不是很成熟。

转载请注明原文地址: https://www.6miu.com/read-29290.html

最新回复(0)