为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking)。关于这几个名词的解释网络上也是众多纷纭,每个人说法都不太一样,但说的又似乎很有道理。其实造成这种情况的最主要原因是这四个概念并不是完全隔离、互斥的,而是相互之间有重叠。例如,当提到异步时那调用一定是非阻塞的,提到同步时则一定会有阻塞调用,此谓之重叠;然而如果我们在谈异步,那在调用方的角度来看是一定不存在阻塞的情况发生的,此谓之互斥。下面我们详细聊聊对于这几个名词大家应该如何理解。

我们以在单线程环境下调用功能为读取文件内容的方法readFile(filename)为例来模拟一下都会发生什么:

  • 阻塞

调用此方法后主线程进入阻塞状态,期间不能执行任务操作,一直到readFile()返回才能继续执行后面的代码。

  • 非阻塞

调用此方法后,readFile()立刻返回,主线程可以继续执行后面的代码而不需要等待磁盘I/O操作完成。但这里会产生一个问题,主线程怎么才能知道readFile()是否完成?是会有人通知这一事件,还是主线程主动去轮询呢?

  • 同步

其实同步/异步是一个比阻塞/非阻塞更加广泛的概念。我们在说阻塞时,一定是在描述某种I/O操作,比如文件读写和网络收发。而对于同/异步来说则可以用来描述更多的行为,比如对于HTTP协议来说,请求方发起请求后必须要一直等待,直到收到响应才能再次发起其他请求,这就是一种同步,即需要等待你要做的事完成才能继续后面的事。对于readFile()的调用来说,同步则是指主线程必须等待readFile()返回(即干完了事)才能继续执行后面的代码,这点跟阻塞是完全相同的。也就是说,当我们描述一个方法是同步调用时,则也是在描述这同时也是一个阻塞调用。

可能有朋友会提及一种"同步非阻塞"的概念,即调用readFile()时会马上返回,此为非阻塞,但是后续还需要主线程停止执行其他代码来主动去查询此方法是否完成,此为同步。其实这种说法也是对的,因为上面说过了,同步是一种宽泛的概念,对于这种场景来说,无论"查询"动作是阻塞的还是死循环在查,对于主线程来说它其实是没有机会干其他事的,即无法执行后面的代码,这其实就是广义上的同步。

  • 异步

我们在描述某个方法是异步的时候,其实同时也是在描述这个方法是非阻塞的,这是二者概念上的相同之处。前面在讨论非阻塞时抛出了一个关于调用方到底如何获悉readFile()是否完成的问题,这里就可以回答了。在编程领域,异步除了是在表明方法调用为非阻塞外,也是在暗示调用方并不需要主动查询任务完成情况,而是会"被动"通知。而发起这个通知的"人",往往是操作系统,即操作系统会通过某种方式通知进程,告诉它你所关心的I/O操作已经完成了。为什么用往往呢,还是那句话,异步是一个广泛的概念,除了操作系统 ,我们也可以在用户进程中自己实现这种通知。也就是说谁通知的并不重要,重要的是调用方并不需要主动查询

总结,同步和异步,阻塞和非阻塞这4个概念是相互交叉的,它们既有区别,也有重叠之处。其中,同步更强调调用方需要主动查询子任务是否完成,而异步则强调调用方会被动的收到子任务完成的通知,此期间调用方都可以继续执行其他代码。

下一篇会讲解reactor(反应堆)模式的相关知识。

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

  1. setstate是同步还是异步_谈谈 IO模型:同步、异步、阻塞、非阻塞

    同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...

  2. recvfrom函数 非阻塞_那些年让你迷惑的阻塞、非阻塞、异步、同步

    那些年让你迷惑的阻塞.非阻塞.异步.同步 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清晰地掌握,否则,怎么与面试官谈笑风生(chui niu pi ...

  3. java socket 异步回调函数_浅谈socket同步和异步、阻塞和非阻塞、I/O模型

    原标题:浅谈socket同步和异步.阻塞和非阻塞.I/O模型 在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针 ...

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

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

  5. 阻塞、非阻塞,同步、异步

    链接:https://www.zhihu.com/question/26393784/answer/1714468454 链接:https://www.zhihu.com/question/26393 ...

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

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

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

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

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

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

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

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

最新文章

  1. OUYA游戏开发快速入门教程第1章了解OUYA及其设备
  2. 【4】青龙面板系列教程之QQ通知机器人XDD-plus安装
  3. ChildTuning:试试把Dropout加到梯度上去?
  4. python基础--字符串的内置函数
  5. 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
  6. Android面试题总结加强版(二)
  7. 不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?
  8. 多个pdf合并成一个pdf_十秒教你将多个PDF如何合并成一个PDF
  9. 5.7 Components — Sending Actions From Components to Your Application
  10. IOS中的数据存储 简单总结
  11. 迁移潮来袭!数十个项目宣布即将停止支持 Python 2
  12. 541.反转字符串||
  13. 机器学习周刊第二期:深度学习上了Nature
  14. php求二叉树的深度(1、二叉树就可以递归,因为结构和子结构太相似)(2、谋而后动,算法想清楚,很好过的)...
  15. 基于五种机器算法的信用风险评估
  16. html 调用es2015模块,ES 2015 Modules
  17. 【BJOI 2019】排兵布阵
  18. cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)
  19. MySQL 的统计直方图
  20. 如何将long类型的时间变量转变为标准时间

热门文章

  1. OpenGl的glMatrixMode()函数理解
  2. 在Mac上设置环境变量并永久生效的方法
  3. 在Ubuntu 16.04.3 LTS上玩转quic-go项目
  4. 在Ubuntu 14.04 64bit上安装redis 3.0.3
  5. FlameScope 更高级全面的火焰图
  6. pandas学习之Series结构
  7. 在Java连接hbase时出现的问题
  8. w3cscholl的在线代码编辑工具
  9. Android KTV
  10. java io在文件结尾持续添加内容