请教关于同步阻塞,同步非阻塞,异步阻塞,异步非阻塞的区别?

最近网络编程学到同步和异步,阻塞和非阻塞相关内容,感觉学得不是很懂。上网查了很多资料,个人感觉同步和异步,阻塞和非阻塞其实都是等或不等的区别,只是同步和异步是针对消息的通知的情况,阻塞和非阻塞是针对等待消息这个角度。请问我这么理解有错吗?

其次是这些名词分开说我到是能理解,但结合起来,比如同步非阻塞,这样说我就懵逼了(到底是等还是不等,还是花式等?)。希望有小伙伴能较为详细的替我解释一下。

不要举在银行办事的例子了,我就是这个例子看晕的,如果有具体一些的业务场景就更好了。

谢谢各位的解答。

阅读 5.6k
3 个回答

首先同步/异步,阻塞/非阻塞不用一起去看他们,因为他们不是一回事。两者的区别在于关注点不同:
同步/异步的关注点在于 ”是否需要得到消息“。
阻塞/非阻塞 的关注点在于 “等待调用结果时状态(要么等待结果(当前进程啥也做不了),要么不等待(以后偶尔再看下这个调用有结果没)”。
现实栗子的话:
同步/异步:

  • 我听说你有个秘密(我很好奇),所以我打电话询问你,你不在,同步就是我等到他回来再挂电话(电话虽然一直接着(但此时我的目的是在于获取秘密,我可以边打电话边看书))

  • 异步就是我立刻挂了(既然不在那就算了,再也不听你的秘密了),至于你几时回来就与我没什么关系了。 (这里着重在于获取秘密 (即获取消息))

阻塞/非阻塞:

  • 阻塞就是我要上官网买小米手机,由于量少,我必须一刻不停的在电脑前,手在不停的刷新网页,脑在不停的转动,眼睛不停的看着显示器,这个时候的我除非等到抢购完了(可能有也可能没有)我才能去做其他事。

  • 非阻塞就是:爱买不买,当前没有我就去玩游戏了,偶尔再回来看看抢购结束没。

他们看起来有些类似,但其实应用的场景不一样,关注点也不一样

知乎有个不错的回答可以看看:怎样理解阻塞非阻塞与同步异步的区别?

根据 @gzchen 提供的知乎连接中,大概理解了,现在自问自答,同时也算是总结一下。

以老师让同学抄资料为例。

  • 老师死盯着一位同学抄资料,直到这位同学抄完----------阻塞IO

  • 老师让一位同学抄资料,但老师玩玩手机,时不时主动询问这位同学抄完了没有。------------非阻塞IO

  • 老师让多名同学抄资料,自己在一旁玩手机,抄完资料的同学举手示意,老师收取资料。---------信号驱动IO

  • 老师不再理会抄资料的进度,比如去上课了。同学抄完资料放到老师的办公室桌面上(消息通知),老师看到了,便知道资料是否抄完了。--------异步IO

其实除了最后一点,其余的都算作同步IO。因为脑洞有限,实在未能想象出异步阻塞与非阻塞的例子比喻。

但简单的来说:

同步/异步,在于消息的通知机制。例如老师是主动关注资料抄写进度还是被动接收通知
阻塞/非阻塞,是指当要访问数据的时候,是否需要死等该数据就绪。例如死盯着抄写进度,还是玩玩手机再去关注。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进