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

来源:互联网 发布:追求卓越 知乎 编辑:程序博客网 时间:2024/06/04 19:31

转载自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操作以后会通知应用程序。

发展还不是很成熟。