• 同步、异步、阻塞和非阻塞之间的区别


    同步异步阻塞非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。

    1. 同步和异步

    同步和异步描述的是消息通信的机制

    同步

    当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或者response的返回特别快,但是针对这一次请求而言就是一个同步的调用。

    异步

    当一个request发送出去以后,没有得到想要的response,而是通过后面的callback、状态或者通知的方式获得结果。可以这么理解,对于异步请求分两步:1)调用方发送request没有返回对应的response(可能是一个空的response)2)服务提供方将response处理完成以后通过callback的方式通知调用方。对于1)而言是同步操作(调用方请求服务方),对于2)而言也是同步操作(服务方回掉调用方)。从请求的目的(调用方发送一个request,希望获得对应的response)来看,这两个步骤拆分开来没有任何意义,需要结合起来看,而这整个过程就是一次异步请求。异步请求有一个最典型的特点:需要callback、状态或者通知的方式来告知调用方结果

    2. 阻塞和非阻塞

    阻塞和非阻塞描述的是程序在等待调用结果(消息,返回值)时的状态

    阻塞

    阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起,当服务方得到response后就唤醒挂起线程,并将response返回给调用方。

    非阻塞

    非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,直到得到response后才返回。

    阻塞非阻塞最大的区别就是看调用方线程是否会被挂起。

    3. 同步、异步、阻塞和非阻塞IO

    同步阻塞IO

    同步阻塞IO

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

    异步阻塞IO

    异步阻塞IO

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

    同步非阻塞IO

    同步非阻塞IO

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

    异步非阻塞IO

    异步非阻塞IO

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

    总结

    • 同步和异步就看调用方是否需要通过callback、通知或者状态来获取结果
    • 阻塞和非阻塞就看调用方在发送请求后是否block住了
  • 相关阅读:
    GridView中使用DataFromatString
    添加文件Node
    GridView技巧1:加入序号
    Android UI控件Spinner控件的学习
    Android UI开发之RadioButton
    二叉树
    visual studio toolbox 修复
    github笔记
    nhibernate manytoone 没有匹配项时的异常
    DataMember 特性
  • 原文地址:https://www.cnblogs.com/pinxiong/p/13288118.html
Copyright © 2020-2023  润新知