你真的理解同步异步和阻塞非阻塞吗?
同步、异步、阻塞、非阻塞都是和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是同步阻塞。
希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。
扫描下方二维码关注微信公众号,您会收到更多优质文章推送。