阻塞非阻塞 / 同步异步之间的区别是什么?
原则:
- 阻塞非阻塞是 遇到 IO 操作时 的处理
- 同步异步是 访问数据的方式
阻塞 和 非阻塞
阻塞: 遇到 io 操作 会将线程挂起,直到有了结果,会继续往下走
非阻塞: 遇到 io 操作 不会挂起线程,会做其他事情(如果没有事情要做,这段时间就会浪费),时不时会检查是否有了结果果
同步 和 异步
同步: 需要主动读写数据,在读写数据的过程中还是会阻塞
异步: 等待I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写(io完成,会进行通报)
举例说明
小明的故事
对上面所讲的概念再次进行一个场景梳理,上面已经明确说明,同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。
同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
同步体现在:等待下载完成通知;
阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;
同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
同步体现在:等待下载完成通知;
非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】
异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
异步体现在:下载完成“叮”一声通知;
阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;
异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
异步体现在:下载完成“叮”一声通知;
非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】
所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁: