浅谈同步、异步、阻塞、非阻塞

这四个名词的概念包括我很多人在内时常会混淆,而且在面试一些知名企业的时候面试官又很爱问,我之前面试腾讯的时候,面试官就问过这个问题,他就抓住你很容易混淆的点来问:

你来说一下同步和阻塞的区别,异步和非阻塞的区别,当时的我本来就有点乱,他把这两对放一起就更混乱了,所以面试完就赶紧犯了很多资料,今天写一下自己的见解。

首先,我想说明的是,我们可以把同步、异步看作一组,阻塞和非阻塞看作一组。

这两组的主要区别就在与:前者是“消息通知机制”,后者是“等待通知时的状态”

关于同步:就是同步调用发出后,调用程序的执行依赖另一个程序的执行结果,只有依赖程序完成返回结果,调用程序才会继续执行。如果依赖程序没有执行完成,那么当前的程序就无法执行,也就是,要么都一起完成,要么都失败(这句话有瑕疵,但是方便理解,依赖时间完成,当前程序执行的时候可能会失败)。

关于异步:就是异步调用发出后,调用者不能立即获得返回消息,当处理这个调用的程序执行完成的时候会通过状态或者回调来通知调用者。

关于阻塞:程序的执行需要某种资源,当资源或者条件不满足的时候,程序挂起进入睡眠状态,条件满足的时候继续执行。

或者阻塞调用发出后,当前程序挂起,等待处理调用的程序返回结果以后才被唤醒。

很多人,会觉得同步和阻塞是一个东西,其实二者是有区别的:

同步调用发出后,调用者可能还是激活的状态,在等待的过程中可能还在做其他的事情,比如,你在排队买饭,在排队(同步)的同时你在打电话。

借这个例子也有必要说明同步阻塞和同步非阻塞:

同步阻塞--->在排队的时候没有干其他的事情,就是等待前面的人打到饭这个结果,得到结果以后执行。

同步非阻塞--->在排队的时候打电话,做其他的事情,当前面的人打到饭这个结果产生,自己买饭。(这中间可能会频繁的切换cpu)

阻塞调用发出后,调用者一直挂起状态,只有等到调用结果返回,才有可能被唤醒。

关于非阻塞:非阻塞调用发出后,调用者不必等待调用结果,就能立即返回,看似效率增加,但是很有可能造成线程切换频繁,产生很多不必要的上下文切换。

最后看一下异步阻塞和异步非阻塞的区别:

异步阻塞就是,你菜点好了,窗口卖饭的通知你取餐,在这个过程中你什么也没有做。

异步非阻塞:就是你菜点好了,只要菜做好了窗口卖饭的通知你就行了,你不必排队等餐啦,在等通知的时候你在做自己的事情,看手机短信,或者看电子书,等到听到卖饭的叫你的时候,你就可以去取餐了。

综上所述:异步非阻塞是效率最高的,因为等待和通知不是发生在一个人身上,就比如你打饭的时候去干别的,让一个人在轮到你的时候叫你一声。通知和干别的事不是一个人完成的,所以没有频繁的上下文切换(和同步非阻塞区别)。

最后举一个很形象的例子,摘自:点击打开链接

对上面所讲的概念再次进行一个场景梳理,上面已经明确说明,同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。

  1. 同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。

同步体现在:等待下载完成通知;

阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;

  1. 同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

同步体现在:等待下载完成通知;

非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】

  1. 异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

异步体现在:下载完成“叮”一声通知;

阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;

  1. 异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

异步体现在:下载完成“叮”一声通知;

非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁

在银行的例子中,这个桥梁就是小纸条上面的号码。

在小明的例子中,这个桥梁就是软件“叮”的声音。

最后,请大家注意理解“消息通知机制”和“等待消息通知时的状态”这两个概念,这是理解四个概念的关键所在。


参考链接:https://www.jianshu.com/p/aed6067eeac9


发布了66 篇原创文章 · 获赞 230 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/lyztyycode/article/details/80905859