同步和异步、阻塞和非阻塞
同步/异步关注的是(线程间)消息通知的机制,而阻塞/非阻塞关注的是程序(线程内)等待消息通知时的状态。
同步操作时,调用者需要等待被调用者返回结果,代码才能继续往下执行。
而异步则相反,调用者不需要等待被调用者返回结果,即可继续往下执行代码,被调用者通常依靠事件、回调等机制,异步地通知调用者结果。
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。
同步阻塞
小明一直盯着下载进度条,中途不能干别的,只能盯着进度条,到 100% 的时候就完成。
- 同步体现在:小明要自己去看进度条是不是到100%。
- 阻塞体现在:下载完成之前,不能做其他任务处理。
同步非阻塞
小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
- 同步体现在:小明要自己去看进度条是不是到100%。
- 非阻塞体现在:下载完成之前,可以做点别的(比如接电话),只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】
异步阻塞
小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
- 异步体现在:下载完成“叮”一声通知;
- 阻塞体现在:等待下载完成“叮”一声通知过程中,不能处理其他事情;
异步非阻塞
仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
- 异步体现在:下载完成“叮”一声通知;
- 非阻塞体现在:等待下载完成“叮”一声通知过程中,可以做别的事情,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】
也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。
所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁:在小明的例子中,这个桥梁就是软件“叮”的声音。