Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别
引言
在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊。要想学好Netty,这几个概念必须要掌握清楚。
同步和异步
同步与异步的区别在于,异步基于通知,当程序执行完毕后后,会有一个通知的机制来告知你程序执行完毕;而同步则没有,只能通过自己调用API去查询程序是否已经执行完毕。
阻塞与非阻塞
阻塞与非阻塞的却别在于,阻塞不能执行其他代码,必须等待结果返回。而非阻塞则表示在等待执行结果返回的过程中可以去做别的事情。
举例
同步阻塞:隔壁老王买了一个电饭煲,然后老王开始煮饭,煮饭的过程中一直守着电饭煲什么事情都不干。蠢!
同步非阻塞:老王第二天开始煮饭,煮饭的时候学聪明了,老王跑去客厅看电视了,然后每隔10分钟来看看饭做好没有。恩恩,聪明了许多。
异步阻塞:老王发现做饭怎么这么麻烦呀,于是跑去商场买了一个带通知的电饭煲,当饭煮好以后,电饭煲会播放音乐。老王用新买的电饭煲开始做饭,煮饭的过程中一直守着电饭煲什么事情都不干。蠢到极致!!
异步非阻塞:老王第二天也用新买的电饭煲做饭,这次学聪明了,跑去客厅看电视,然后饭做好了,开始播放音乐。老王这时跑到厨房美滋滋的开始吃起了饭。嗯,完美!
异步就一定比同步快吗?
不一定!在打多时候异步并不比同步快。从本质上来讲,异步只是解决并发的效率问题,如果只有一个程序在运行,异步的执行速度可能还会稍慢于异步,因为还维护了一个通知机制。
根据需求来决定是使用同步还是使用异步。
同步的好处:
1、同步流程对结果处理通常更为简单,可以就近处理。
2、同步流程对结果的处理始终和前文保持在一个上下文内。
3、同步流程可以很容易捕获、处理异常。
4、同步流程是最天然的控制过程顺序执行的方式。
异步的好处:
1、异步流程可以立即给调用方返回初步的结果。
2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。
4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。
非阻塞就一定比阻塞好吗?
不一定! 如果所需要执行的任务时间片很短,那么非阻塞的方式由于会经常进行上线文切换,切换上下文所需的代价可能会让程序执行效率大大下降,得不偿失。
总结
关于同步/异步,阻塞/非阻塞。使用都是根据场景来决定的,并不能一味地说谁比谁有优势,谁比谁好。存在就有他存在的价值。希望大家能彻底理解这几个概念,对今后的学习有很大的帮助。
Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别的更多相关文章
- Netty基础系列(3) --彻底理解NIO
前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...
- Netty基础系列(4) --堆外内存与零拷贝详解
前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...
- 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?
“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO
以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...
- JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...
- c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
llinux epoll系列4 利用epoll_wait实现非阻塞的connect connect函数是阻塞的,而且不能设置connect函数的timeout时间,所以一旦阻塞太长时间,影响用户的体验 ...
- c#基础系列3---深入理解ref 和out
"大菜":源于自己刚踏入猿途混沌时起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 扩展阅读 c#基础系列1---深入理解 值类型和引用类型 c#基础系 ...
- 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步
IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...
随机推荐
- remove duplicate of the sorted array
description: Given a sorted array, remove the duplicates in place such that each element appear only ...
- margin-right没有效果的问题
margin-right其实有效果的,只是在默认即标准流的情况的下显示不出来效果.如果脱离标准流呢?想到这个,就立马在css文件中加了一个:float:right;然后在测试的时候就能看到margin ...
- linux监控系统的状态
1.命令w的第一行和uptime或者用upload2.system load averages 表示单位时间短内活动的进程数3.查看cpu的个数和核数processor.physical id 4.v ...
- Arduino初学
常见关键字 声明变量及接口名称(int val;int ledPin=13;) setup()--函数在程序开始时使用,可以初始化变量.接口模式.启用库等(例如:pinMode(ledPin,OUTU ...
- 读取本地outlook邮件内容
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JS 数据类型、赋值、深拷贝和浅拷贝
js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 ...
- pycharm linux版快捷方式创建
****************************pycharm_linux安装and快捷方式创建******************1.下载好安装包之后解压: tar -xfz 压缩包名 ...
- 转)ZooKeeper的实现分析
最近在大量看关于Zookeeper的博客,发现一篇讲解ZK实现很详细的博客,特此转载一下: 原博客地址: http://my.oschina.net/zhengyang841117/blog/1866 ...
- 数据结构之ConcurrentHashMap
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap ...
- mybatis的sqlmapper详解
http://blog.csdn.net/u012302681/article/details/46326877