引言

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

同步和异步

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

阻塞与非阻塞

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

举例

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

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

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

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

异步就一定比同步快吗?

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

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

同步的好处:

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

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

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

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

异步的好处:

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

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

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

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

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

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

总结

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

Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别的更多相关文章

  1. Netty基础系列(3) --彻底理解NIO

    前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...

  2. Netty基础系列(4) --堆外内存与零拷贝详解

    前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...

  3. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  4. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  5. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  6. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  7. c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect

    llinux epoll系列4 利用epoll_wait实现非阻塞的connect connect函数是阻塞的,而且不能设置connect函数的timeout时间,所以一旦阻塞太长时间,影响用户的体验 ...

  8. c#基础系列3---深入理解ref 和out

    "大菜":源于自己刚踏入猿途混沌时起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 扩展阅读 c#基础系列1---深入理解 值类型和引用类型 c#基础系 ...

  9. 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步

    IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...

随机推荐

  1. mysql-高级操作

    主键冲突 主键冲突的时候,可以选择更新或者替换进行处理 更新 主键冲突,更新操作. Insert into 表名[(字段列表:包含主键)] values(值列表) on duplicate key u ...

  2. cug-day02

    昨天就主要就熟悉了项目,今天就简单完成了 后台代码,但是没有进行测试,前端的vue也不是很懂,所以还有很多需要学习的地方. 目前主要就是需要理解项目运行流程, 项目采用的是ssh ,用了vo和po , ...

  3. 【问题】sql数据库报无效的数据证书,需重新安装

    事情的经过: 今天打开sql2014数据库,没有成功运行,但是给我弹出一个"无效的数据证书,需要重新安装!"提示.什么情况.为什么,应该是前一天弄vs导致的.因为升级了vs2017 ...

  4. android 开发常见问题

    指定版本 就OK了 路径: android/app/build.gradle compile ("com.facebook.react:react-native:填你自己的RN版本" ...

  5. Maven学习(六)-- Maven与Eclipse整合

    由于我使用的是IDEA所以就不摘录了,感兴趣的移步 Maven学习总结(六)--Maven与Eclipse整合 Maven学习总结(七)--eclipse中使用Maven创建Web项目  

  6. Netty中如何写大型数据

    因为网络饱和的可能性,如何在异步框架中高效地写大块的数据是一个特殊的问题.由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知ChannelFuture.当这种情况发生时,如 ...

  7. 计算器源码(数学式python)

    ''' ******************** 请计算表达式: 1 - 2 * ( (60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...

  8. PyCharm中设置字体大小

    1.在file(文件)里面找到setting(设置) 2. 然后再左面Editor里面找Font,再到右面Size里面设置字体大小

  9. Linux网络简介

    Linux的网络简介 1.TCP/IP协议簇  (通俗的解释就是为了网路传输指定的一种标准),它将网络划分为四层:应用层 .传输层.互联层 .网络接口层 . 基础层是网络接口层(说白了就是把帧格式的数 ...

  10. Python之深浅拷贝

    拷贝就是拷贝,何来深浅之说? Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 浅拷贝 l1 = [1,2,3 ...