一、同步与异步的区别:

同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。

异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,一次它是一个不可靠的服务序列。

消息通知中的同步和异步

同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;

异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。在调用结束之后,通过消息回调来通知调用者是否调用成功。

调用者获取异步调用服务结果的两种方式:一种是主动去轮训查询异步回调的结果;一种调用依赖服务时传入一个callback方法或者回调地址,依赖服务完成之后去调用callback通知调用者;一般情况,这两种方式都要支持才是一种良好的异步回调设计方法。

场景比喻

小明去买奶茶,可能会有两种方式
1、小明点单交钱,然后等着取奶茶;
2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;

第一种方式就是同步,就等着奶茶妹做好奶茶,奶茶做好之后,小明拿到奶茶才算完成整个任务
第二种方式就是异步,奶茶妹给了小明一个小票,小明就算完成了。至于最后奶茶做好没有,反正奶茶妹会告诉小明的,那是后面的事情了。

所以: 同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。结合场景就是,拿到奶茶的方式。

二、阻塞与非阻塞的区别

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。
非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。
阻塞调用和同步调用不同的。对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。

同步、异步&阻塞、非阻塞

(a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
(b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;

所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;

场景比喻

还是小明去买奶茶,可能会有两种方式:

1、小明点单交钱,然后等着取奶茶;
——同步阻塞:小明在等着取奶茶的时候呢,啥都不干,就等着;小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。
——同步非阻塞:小明在等着取奶茶的时候呢,翻出手机,一会翻翻微信朋友圈,一会瞅瞅奶茶妹有没有做好奶茶;小明这种行为就叫做非阻塞,因为没有阻塞在等奶茶这件事情上。而这种方式又叫做同步非阻塞。
2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取
——异步阻塞:奶茶妹给了小明一个小票,然后小明还是傻等着;小明这种拿到票还傻等着的行为,就叫阻塞。而这种行为,又叫做异步阻塞!这种最傻了。
——异步非阻塞:奶茶妹给了小明一个小票,然后小明翻出手机一直刷朋友圈,过了一会儿奶茶妹说小明你的奶茶好了,过来拿,小明才放下手机去拿奶茶。这种方式就叫做非阻塞,又叫着异步非阻塞!

所以:阻塞与非阻塞的区别重点在于当前线程等待消息返回的行为。换成场景就是,小明等奶茶的行为。

总结:

1、同步阻塞:小明啥都不干等奶茶。
2、同步非阻塞:小明一边玩手机一边等奶茶。
3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了

同步异步以及阻塞和非阻塞的区别相关推荐

  1. 同步与异步,阻塞与非阻塞的区别

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  2. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清

    为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...

  3. 那些年让你迷惑的阻塞、非阻塞、异步、同步

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清 ...

  4. 这次,让我们捋清:同步、异步、阻塞、非阻塞

    继上一篇说透I/O模型后,我们来谈谈网络 I/O 经常会伴随的几个容易令人混淆的概念:同步.异步.阻塞.非阻塞的区别. 这篇写完之后铺垫就差不多了,之后就正式开始 Netty 深度剖析了,敬请期待,嘻 ...

  5. 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

    承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...

  6. 并发、并行、串行、同步、异步、阻塞、非阻塞

    并发.并行.串行.同步.异步.阻塞.非阻塞 实际上同步与异步是针对应用程序与内核的交互而言的. 同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是 ...

  7. 理解同步异步、阻塞与非阻塞

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

  8. linux socket 阻塞与非阻塞,同步与异步

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:       所谓同步,就是在c端发出 ...

  9. linux 同步与异步--阻塞与非阻塞型I/O

    同步阻塞IO 在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了).ke ...

  10. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

最新文章

  1. tzselect 设置时间
  2. db2 迁移mysql,mysql 迁移 db2
  3. 解析mysqlbinlog日志_mysqlbinlog日志分析 日志挖掘 违规操作
  4. 【Python】Matplotlib使用字符串代替变量绘制散点图
  5. python变量命名规则思维导图_python基础知识点思维导图
  6. NVMe驱动解析-DMA传输
  7. php扩展exif模块,Centos+PHP模块+exif扩展 (第三方模块)
  8. catia二次开发c语言,CATIA二次开发1_VB语言基础语法
  9. 浅谈常见浏览器缓存方法(前端缓存)
  10. 基于opencv的图像拼接
  11. 鸿蒙系统官网电脑版,华为鸿蒙pc系统
  12. 导出pdf文件时加图片水印
  13. Powershell运行脚本异常:无法加载文件...因为在此系统上禁止运行脚本
  14. GBase 8c产品家族及功能简介
  15. UG NX二次开发(C#)-装配-添加组件AddComponent
  16. 语音识别第4讲:语音特征参数MFCC
  17. python3.7爬虫
  18. 如何掌控自己的时间和生活
  19. 怎么把It驻场开发推广出去
  20. 小事认真,大事才会卓越

热门文章

  1. java类里面再定一个类_java类的里面可以再定义一个类吗 java里可不可以在一个...
  2. java计算机毕业设计婚恋网站源码+mysql数据库+系统+lw文档+部署
  3. 1. linux下gradle环境安装
  4. 国务院通知明确2008年节假日具体安排
  5. c语言桌游,那些超受欢迎的桌游——你玩过几个?(一)
  6. 纯干货!77个Python常用函数汇总,赶紧收藏!
  7. win10无法检测java_win10下配置JAVA环境变量(以及错误: 找不到或无法加载主类的处理方法)...
  8. docker inspect命令查看镜像详细信息
  9. 【组合数学】第二类斯特林数
  10. Dinic Algorithm