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

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

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

总结

同步和异步就看调用方是否需要通过callback、通知或者状态来获取结果
阻塞和非阻塞就看调用方在发送请求后是否block住了

我目前是在职Java开发,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线等方面的问题,都可以申请加入我的Java学习园地,里面聚集了很多正在自学Java的初学者,文件里面还有我做Java技术这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书记教程,需要的话都可以自行来浏览获取。

同步、异步、阻塞和非阻塞之间的区别相关推荐

  1. 同步和异步、阻塞和非阻塞之间的关系以及同步阻塞、同步非阻塞、异步阻塞、异步非阻塞的含义

    目录 从线程的维度来理解同步和异步.阻塞和非阻塞. 从线程维度来理解同步阻塞.同步非阻塞.异步阻塞.异步非阻塞. 从线程的维度来理解同步和异步.阻塞和非阻塞. 先假设有 线程A 和 线程B 两个线程, ...

  2. java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别

    同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...

  3. 写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别

    当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. < IO - 同步,异步,阻塞,非阻塞 >是我在开始学习epoll和libevent的时候写的,主要的思路来 ...

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

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

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

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

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

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

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

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

  8. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  9. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

最新文章

  1. MyBatis 注释
  2. 顺丰被删库?半个DBA的跑路经验总结
  3. ICCV 2017 《Towards End-to-End Text Spotting with Convolutional Recurrent Neural Network》论文笔记
  4. Linux服务器编程之:link()函数,ln命令,symlink,readlink,案例说明
  5. Oracle10g备份集压缩新特性(Backupset Compression)
  6. Linux内核参数的介绍
  7. 小鑫与斐波那契(一)
  8. restful是什么
  9. 洛谷P1079 Vigenère 密码
  10. java猜数游戏有次数限制_幼小衔接可以用的超有趣的数学小游戏
  11. 数学基础task08 二重积分
  12. 001 线性代数之行列式:定义、逆序数、余子式与代数余子式、n个易算行列式、范德蒙行列式
  13. Unet——pytorch
  14. Linux服务器开发,Posix API与网络协议栈
  15. 移动安全常用技术相关术语总结
  16. MySQL 8.0.20 Window10免安装版配置及Navicat管理
  17. [Unity2D/3D]实用的血条制作(第二期)
  18. linux 给u盘 变更名字,u盘怎么改名字|在电脑修改U盘名字的方法
  19. Firefox扩展初接触
  20. 开门最快的服务器,魔兽怀旧服最有牌面的服务器,开门进度惊人,国服的牌面...

热门文章

  1. 空中课堂19.7.22 2 英语笔记
  2. python中mktime函数_Python time mktime()方法
  3. ubuntu关闭防火墙命令
  4. 独立按键的奇偶数检测
  5. mac远程连接mysql
  6. Vue生命周期函数解析及各个组件间调用顺序
  7. Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核
  8. 嘉兴 机器人仓库 菜鸟_中国最大智能机器人仓库启用,拣货效率至少提升三倍!...
  9. JS基础:基本包装类型
  10. 13.包装类型应用及场景