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

原创
2016/07/06 17:11
阅读数 4.7K

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

一、同步与异步的区别

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、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了
展开阅读全文
打赏
18
171 收藏
分享
加载中
haoran_10博主

引用来自“Somewhere”的评论

有什么操作能说明,同步阻塞和同步非阻塞?或者怎样实现同步非阻塞?或者异步阻塞?
http://my.oschina.net/haoran100/blog/708683
2016/07/11 10:06
回复
举报

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

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

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

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

引用来自“hellonode”的评论

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

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

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

还以为你有什么高见呢,好好读读文章再说吧
2016/07/08 21:49
回复
举报

引用来自“haoran_10”的评论

引用来自“hellonode”的评论

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

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

不是脑残是什么?
2016/07/08 21:37
回复
举报
haoran_10博主

引用来自“hellonode”的评论

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

别这么没素质!错在哪里指出来,说别人之前先看看自己是不是脑残
2016/07/08 21:12
回复
举报
果然胡说八道的文章受人喜欢。
有同步非阻塞这种说法吗?
脑残文害人害已。
2016/07/08 19:28
回复
举报
更多评论
打赏
33 评论
171 收藏
18
分享
返回顶部
顶部