zoukankan      html  css  js  c++  java
  • Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别

    引言

    在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊。要想学好Netty,这几个概念必须要掌握清楚。

    同步和异步

    同步与异步的区别在于,异步基于通知,当程序执行完毕后后,会有一个通知的机制来告知你程序执行完毕;而同步则没有,只能通过自己调用API去查询程序是否已经执行完毕。

    阻塞与非阻塞

    阻塞与非阻塞的却别在于,阻塞不能执行其他代码,必须等待结果返回。而非阻塞则表示在等待执行结果返回的过程中可以去做别的事情。

    举例

    同步阻塞:隔壁老王买了一个电饭煲,然后老王开始煮饭,煮饭的过程中一直守着电饭煲什么事情都不干。蠢!

    同步非阻塞:老王第二天开始煮饭,煮饭的时候学聪明了,老王跑去客厅看电视了,然后每隔10分钟来看看饭做好没有。恩恩,聪明了许多。

    异步阻塞:老王发现做饭怎么这么麻烦呀,于是跑去商场买了一个带通知的电饭煲,当饭煮好以后,电饭煲会播放音乐。老王用新买的电饭煲开始做饭,煮饭的过程中一直守着电饭煲什么事情都不干。蠢到极致!!

    异步非阻塞:老王第二天也用新买的电饭煲做饭,这次学聪明了,跑去客厅看电视,然后饭做好了,开始播放音乐。老王这时跑到厨房美滋滋的开始吃起了饭。嗯,完美!

    异步就一定比同步快吗?

    不一定!在打多时候异步并不比同步快。从本质上来讲,异步只是解决并发的效率问题,如果只有一个程序在运行,异步的执行速度可能还会稍慢于同步,因为还维护了一个通知机制。

    根据需求来决定是使用同步还是使用异步。

    同步的好处:

    1、同步流程对结果处理通常更为简单,可以就近处理。

    2、同步流程对结果的处理始终和前文保持在一个上下文内。

    3、同步流程可以很容易捕获、处理异常。

    4、同步流程是最天然的控制过程顺序执行的方式。

    异步的好处:

    1、异步流程可以立即给调用方返回初步的结果。

    2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。

    3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。

    4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。

    非阻塞就一定比阻塞好吗?

    不一定! 如果所需要执行的任务时间片很短,那么非阻塞的方式由于会经常进行上线文切换,切换上下文所需的代价可能会让程序执行效率大大下降,得不偿失。

    总结

    关于同步/异步,阻塞/非阻塞。使用都是根据场景来决定的,并不能一味地说谁比谁有优势,谁比谁好。存在就有他存在的价值。希望大家能彻底理解这几个概念,对今后的学习有很大的帮助。

  • 相关阅读:
    新建存储过程
    c#List移除列表中的元素
    学习总结初篇:发现问题
    webpack的几个使用方法
    Does Lamda expression return value?
    委托的最佳科普解释
    正则表达式字符匹配攻略
    Beta冲刺 第一天
    ###Beta准备
    高校征信系统项目Postmortem结果
  • 原文地址:https://www.cnblogs.com/zhxiansheng/p/10789114.html
Copyright © 2011-2022 走看看