zoukankan      html  css  js  c++  java
  • 你真的理解同步异步和阻塞非阻塞吗?

    同步、异步、阻塞、非阻塞都是和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是同步阻塞。

     

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

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

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    Game的基本元素.[小糊涂的灵感]
    J2ME图书介绍 [小糊涂的灵感]
    j2me 这个论坛好一点.[小糊涂的灵感]
    Frame rate test for tilebased games 测试结果.[小糊涂的灵感]
    源码方式在ubuntu系统上安装ruby1.9.2
    模块全解======>>ruby的类是单继承生物、所以出现了module、实现了多继承
    在ubuntu下安装rails3.0
    在ubuntu下编写运行shell脚本
    在linux下开远程桌面访问windows的解决方法
    在命令行中打开sqlite的数据库
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/14617891.html
Copyright © 2011-2022 走看看