你真的理解同步异步和阻塞非阻塞吗?

同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。

怎么理解同步,异步和阻塞,非阻塞?

那我先讲下同步异步和阻塞非阻塞这两大块之间的区别

他们针对的对象不同,好比A调用B,同步异步针对的是被调用者也就是B,阻塞非阻塞针对的是调用者也就是A。

然后我们再来讲一下什么是同步和异步

A调用B,同步异步针对得是调用方B

如果是同步的话,B处理完后有结果了才通知A.

如果是异步的话,B在接到请求后先告诉A我已经接到请求了,然后有结果后再通过callback、通知或者状态等方式再通知A。

同步和异步最大的区别就是被调用方B的执行方式和返回时机。

什么是阻塞和非阻塞?

A调用B,我们针对得是调用方A

如果是阻塞的话,A只能等待B返回结果后,才能去干别的事情

如果是非阻塞得话就是A不用等着B返回结果,可以先去做别的事情。

同步,异步和阻塞,非阻塞间的配合使用

有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。同步场景中可能包含阻塞和非阻塞情况的。异步场景中可能包含阻塞和非阻塞情况的。

Java中的三种IO模型

在Java语言中,一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。

BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。

NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。

AIO (Asynchronous I/O):异步非阻塞I/O模型。

通过流程图的方式去理解

同步阻塞IO

针对Sender而言,请求发送出去以后,一直等到Receiver有结果了才返回,这是同步。在Sender获取结果的期间一直被blocked住了,也就是在此期间Sender不能处理其它事情,这是阻塞。

异步阻塞IO

 

 

 针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。

同步非阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到Receiver处理好结果后,最后一次发请求给Receiver才获得response。Sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在Sender等待Receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。

异步非阻塞IO

 针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直是可以处理其它事情的,这是非阻塞。

应用说明

(1)  Redis速度快的原因之一就是因为是异步非阻塞的。

(2)  R2dbc和MyBatis/JPA一样都是访问数据库的技术,不同的是 R2DBC是异步非阻塞的MyBatis/JPA是同步阻塞。

 

希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。

扫描下方二维码关注微信公众号,您会收到更多优质文章推送。

 

posted @ 2021-03-30 11:55  JustJavaIt  阅读(514)  评论(0编辑  收藏  举报