美文网首页
同步、异步、阻塞、非阻塞、回调等概念

同步、异步、阻塞、非阻塞、回调等概念

作者: 陈半仙儿 | 来源:发表于2018-05-13 21:14 被阅读59次

结论

同步和异步是从任务完成后的通知机制来描述任务的概念,而阻塞和非阻塞是从任务提交者的角度来描述任务的。它们只是从不同的维度来描述任务。

另外,回调和同步、异步、阻塞、非阻塞不是一个层次的概念,虽然各种文章经常提到“异步回调”, 但是异步与回调并没有直接的联系,回调只是异步的一种可行的实现方式。当然同步回调也是存在的。

举例

以迅雷下载为例:迅雷下载东西完成时会发出“叮”的一声。

那么根据前面提到的两个维度来排列组合出来可能的任务:

人在观察任务有没有下载完,人作为下载任务的提交者,从人的角度,就有两种可能的方式:

  1. 人在提交下载任务后,啥都不干,等着任务下载完
  2. 人在提交下载任务后,去干其他事情,时不时跑来自己看有没有下载完

从任务通知的角度,迅雷在下载文件后会发出“叮”的一声,因此从是否发出“叮”的一声这个角度,也有两种可能的方式:

  1. 下载完成后,发出“叮”的一声
  2. 下载完成后,不发出“叮”的一声

把这两种方式进行排列组合,一共有2*2=4种情况:

  1. 任务下载时人不可以干其他事情,迅雷不发出声音;
  2. 任务下载时人不可以干其他事情,迅雷发出声音;
  3. 任务下载时人可以干其他事情,迅雷不发出声音;
  4. 任务下载时人可以干其他事情,迅雷发出声音。

同步和异步

迅雷发出声音,就是异步;迅雷不发出声音,就是同步

到底是同步还是异步,跟人是否等着任务完成没有关系,因为同步异步是从任务完成后的通知机制来描述任务的。只要有通知,就是异步;只要没有通知,就是同步。

阻塞和非阻塞

任务下载时人不可以干其他事情,就是阻塞;任务下载时人可以干其他事情,就是非阻塞

到底是阻塞还是非阻塞,跟迅雷是否发出声音没有关系,因为阻塞非阻塞是从任务提交者的角度来描述任务的。只要任务提交者在任务未完成时不能干其他事情,就是阻塞;只要能干其他事情,就是非阻塞。

回到例子

还是前面的例子:

  1. 任务下载时人不可以干其他事情,迅雷不发出声音;(同步,阻塞)

    同步体现在:下载完成后迅雷不会发出“叮”的一声通知你任务完成
    阻塞体现在:任务下载未完成时,人不可以干其他事情

  2. 任务下载时人不可以干其他事情,迅雷发出声音;(异步,阻塞)

    异步体现在:下载完成后迅雷发出“叮”的一声通知你任务下载完成
    阻塞体现在:任务下载未完成时,人不可以干其他事情

  3. 任务下载时人可以干其他事情,迅雷不发出声音;(同步,非阻塞)

    同步体现在:迅雷不会发出声音通知你任务完成
    非阻塞体现在:任务下载未完成时,人可以干其他事情

  4. 任务下载时人可以干其他事情,迅雷发出声音。(异步,非阻塞)

    异步体现在:下载完成后迅雷发出“叮”的一声通知你任务下载完成
    非阻塞体现在:任务下载未完成时,人可以干其他事情

和 IO 联系

Java中有三种IO:BIO/NIO/AIO,按照上面的说法:

  • BIO:同步阻塞

    磁盘完成IO后会通知内核,这个其实从内核的角度看属于异步;但是从上层API调用的角度还是属于同步,因此这里将它算作同步。

  • NIO:同步非阻塞
  • AIO:异步非阻塞

按照排列组合应该有4种情况啊,上面只有3种,仔细一看发现缺少了异步阻塞,Java类库为什么没有呢?

以前面迅雷下载的例子为例,异步阻塞相当于:人提交了下载任务给迅雷,任务完成后迅雷会发出声音通知人,但是人提交任务后啥都不干,坐在那里等着迅雷发出声音... (这种行为感觉有点智障吧)。

进一步联系到Linux的传统IO和IO多路复用:

  1. read,write,fopen等这类函数,是同步阻塞,Java-BIO 的 OS 模型;
  2. select/poll模型,是同步非阻塞,Java-NIO 的 OS 模型;
  3. epoll模型,是异步非阻塞。

相关文章

  • 阻塞非阻塞 同步异步 IO模型及其应用 NIO实现原理

    1.同步异步概念 2.阻塞非阻塞概念 3.常见I/O模型:同步阻塞IO,同步非阻塞IO,异步阻塞IO,异步非阻塞I...

  • 同步、异步、阻塞、非阻塞、回调等概念

    结论 同步和异步是从任务完成后的通知机制来描述任务的概念,而阻塞和非阻塞是从任务提交者的角度来描述任务的。它们只是...

  • BIO NIO AIO

    BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。 io操作分...

  • 谈论:同步异步阻塞非阻塞.md

    同步/异步:关注的方式(是否主动) 阻塞/非阻塞: 同步阻塞BIO: 同步非阻塞NIO: 异步非阻塞: 异步阻塞:

  • 同步、异步、阻塞、非阻塞,这下明白了

    同步阻塞,同步非阻塞,异步阻塞,异步非阻塞... 晕! 头! 转! 向! 对于小白来说,理解这些概念太难了。搜索这...

  • 进程 线程 协程 同步 异步 阻塞 非阻塞

    参考文章: Python 中的进程、线程、协程、同步、异步、回调 简明网络I/O模型---同步异步阻塞非阻塞之惑...

  • IO模型

    同步,异步,阻塞和非阻塞的概念与区别 同步和异步从消息通知机制角度来说的。 两个任务 同步一直等,异步不等 阻塞和...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • 同步,异步,阻塞,非阻塞, 回调

    1.基本概念 引子以ajax为例: 异步就是不等待结果的代码, 异步并不是同时做两件事情 一个小故事:小A烧开水。...

  • IO模型

    原文参考链接 四种状态 同步 异步 阻塞 非阻塞 IO分类 同步阻塞IO 同步非阻塞IO 异步非阻塞IO注意: 没...

网友评论

      本文标题:同步、异步、阻塞、非阻塞、回调等概念

      本文链接:https://www.haomeiwen.com/subject/lhhrdftx.html