文档章节

同步与异步&阻塞与非阻塞

haoran_10
 haoran_10
发布于 2016/07/06 17:11
字数 1596
阅读 4245
收藏 170

一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下

一、同步与异步的区别

1、概念介绍

  • 同步:所谓同步是一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,依赖的服务才能算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。

  • 异步:所谓异步是一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。至于被依赖的服务最终是否真正完成,无法确定,所以它是不可靠的服务序列。

2、消息通知

  • 同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;

  • 异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。实际处理这个调用的部件在完成后,通过消息回调来通知调用者是否调用成功。

PS:调用者获取依赖服务异步回调结果一般有两种方式:
一种是主动去轮训查询异步回调的结果,
一种调用依赖服务时传入一个callback方法或者回调地址,依赖服务完成之后去调用callback通知调用者。
一般情况,这两种方式都要支持才是一种良好的异步回调设计方法。

3、场景比喻

小明去买奶茶,可能会有两种方式

  • 小明点单交钱,然后等着取奶茶;
  • 小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;
第一种方式就是同步,就等着奶茶妹做好奶茶,奶茶做好之后,小明拿到奶茶才算完成整个任务

第二种方式就是异步,奶茶妹给了小明一个小票,小明就算完成了。至于最后奶茶做好没有,反正奶茶妹会告诉小明的,那是后面的事情了。

4、总结

同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。结合场景就是,拿到奶茶的方式。

二、阻塞与非阻塞的区别

1、概念介绍

  • 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。
阻塞调用和同步调用不同的。
对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。

还有一点,在这里先扩展下:
1.如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
2.如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;

所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;
对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回;
  • 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。
增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。

2、场景比喻

还是小明去买奶茶,可能会有两种方式

  • 2.1、小明点单交钱,然后等着取奶茶;
1、小明在等着取奶茶的时候呢,啥都不干,就等着;
小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。

2、小明在等着取奶茶的时候呢,翻出手机,一会翻翻微信朋友圈,一会瞅瞅奶茶妹有没有做好奶茶;
小明这种行为就叫做非阻塞,因为没有阻塞在等奶茶这件事情上。而这种方式又叫做同步非阻塞。
  • 2.2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;
1、奶茶妹给了小明一个小票,然后小明还是傻等着;
小明这种拿到票还傻等着的行为,就叫阻塞。而这种行为,又叫做异步阻塞!这种最傻了。

2、奶茶妹给了小明一个小票,然后小明翻出手机一直刷朋友圈,
过了一会儿奶茶妹说小明你的奶茶好了,过来拿,小明才放下手机去拿奶茶。
这种方式就叫做非阻塞,又叫着异步非阻塞!

3、总结

阻塞与非阻塞的着重点在于当前线程等待消息返回的行为。换成场景就是,小明等奶茶的行为。

三、大总结

  • 1、同步阻塞:小明啥都不干等奶茶。
  • 2、同步非阻塞:小明一边玩手机一边等奶茶。
  • 3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
  • 4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了

© 著作权归作者所有

上一篇: 五大I/O模型详解
下一篇: JVM内存区域模型
haoran_10
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中

评论(33)

haoran_10
haoran_10 博主

引用来自“Somewhere”的评论

有什么操作能说明,同步阻塞和同步非阻塞?或者怎样实现同步非阻塞?或者异步阻塞?
http://my.oschina.net/haoran100/blog/708683
月亮上好冷
月亮上好冷

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。

别这么没素质!错在哪里指出来,说别人之前先看看自己是不是脑残

房主能来几个例子??
枫听烨歌
枫听烨歌
总结的不错,比喻也还好。只是讨论概念,不涉及具体使用我觉得是没问题的。不知道为什麽还有人喷……
国栋
国栋
很多场景下,同步就等价于阻塞,异步就是非阻塞。Message Passing may be either blocking or nonblocking--also known as synchronous and asynchronous.很多时候这两组词根本就没有良好定义,争来争去也没什么意思~
hellonode
hellonode
垃圾文章是读了的。
因为错误,所以才反问。
人可以谈恋爱,代码可以吗?
比喻可以,但是从来不代表正确。
haoran_10
haoran_10 博主

引用来自“hellonode”的评论

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。

别这么没素质!错在哪里指出来,说别人之前先看看自己是不是脑残
麻烦说下什么情况下会出现同步非阻塞的场景?

还以为你有什么高见呢,好好读读文章再说吧
hellonode
hellonode

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。

别这么没素质!错在哪里指出来,说别人之前先看看自己是不是脑残
麻烦说下什么情况下会出现同步非阻塞的场景?
hellonode
hellonode
同步非阻塞是什么概念?
如果你真搞清楚了,就应该知道:
同步就必然是阻塞的。
同步还非阻塞。

不是脑残是什么?
haoran_10
haoran_10 博主

引用来自“hellonode”的评论

果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。

别这么没素质!错在哪里指出来,说别人之前先看看自己是不是脑残
hellonode
hellonode
果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。
Socket 同步/异步 与阻塞/非阻塞区别

在网上看了很多答案,也没找到合适的,也许本文也不是合适答案:) 同步和异步关注的是消息通信机制,而阻塞非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 同步/异步是API 被调用...

山里来的鱼
2015/07/29
0
0
如何理解阻塞和非阻塞同步和异步

同步与异步 同步和异步关注的是消息通信机制,所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这...

清风与你
2017/04/10
0
0
Java中BIO,NIO,AIO的理解

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

圣洁之子
03/13
0
0
同步,异步,阻塞和非阻塞的理解

概念 同步是两个对象之间的关系,而阻塞是一个对象的状态。 同步,异步 访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数...

好铁
2016/08/28
47
0
IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式

最近工作中,接触到了Java网络编程方面的东西:Socket、NIO、MongoDB等,也看了tomcat的源码,也加强了线程方面的知识,也使用了MINA这样的框架。感觉获益良多,原本技术上的薄弱环节也在慢慢...

Zero零_度
2016/02/22
78
0

没有更多内容

加载失败,请刷新页面

加载更多

lua字符串和时间戳相互转换

1. 时间戳转成格式化字符串 直接利用函数os.date()将时间戳转化成格式化字符串.```local timestamp = 1561636137;local strDate = os.date("%Y/%m/%d %H:%M:%S", timestamp)print("strD......

书香神
44分钟前
1
0
代码规范

代码格式化 安装vscode插件:Prettier - Code formatter 格式化配置:将下列配置写入到vscode的settings.json文件 (遵照代码格式化) "prettier.disableLanguages": ["vue"], "prettier.......

TreeZhou0511
今天
5
0
python实现人工神经网络的一个例子

人工神经网络已经有无数的开源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一个小样例,把基本思想讲一讲,因此自己写了一个demo,以供参考。 下面直接上代码,代码中有注释,比...

propagator
今天
6
0
远程dubugger

1、在tomcat的bin下/data/project/XXX/apache-tomcat-8.5.23/bin 在catalina.bat文件中新增如下即可 JAVA_OPTS="-Xmx1024m -Xms1024m -agentlib:jdwp=transport=dt_socket,server=y,suspend......

一只小青蛙
今天
3
0
jemter 连接MySQL

jemter 连接MySQL 点击测试计划,测试计划最后”添加目录或jar包到ClassPath“,点击浏览,添加mysql-connector.jar mysql-connector.jar的下载地址: https://mvnrepository.com/artifact/my...

xiaobai1315
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部