最近网络编程学到同步和异步,阻塞和非阻塞相关内容,感觉学得不是很懂。上网查了很多资料,个人感觉同步和异步,阻塞和非阻塞其实都是等或不等
的区别,只是同步和异步
是针对消息的通知
的情况,阻塞和非阻塞
是针对等待消息
这个角度。请问我这么理解有错吗?
其次是这些名词分开说我到是能理解,但结合起来,比如同步非阻塞
,这样说我就懵逼了(到底是等还是不等,还是花式等?)。希望有小伙伴能较为详细的替我解释一下。
不要举在银行办事的例子了,我就是这个例子看晕的,如果有具体一些的业务场景就更好了。
谢谢各位的解答。
首先同步/异步,阻塞/非阻塞不用一起去看他们,因为他们不是一回事。两者的区别在于关注点不同:
同步/异步的关注点在于 ”是否需要得到消息“。
阻塞/非阻塞 的关注点在于 “等待调用结果时状态(要么等待结果(当前进程啥也做不了),要么不等待(以后偶尔再看下这个调用有结果没)”。
现实栗子的话:
同步/异步:
我听说你有个秘密(我很好奇),所以我打电话询问你,你不在,同步就是我等到他回来再挂电话(电话虽然一直接着(但此时我的目的是在于获取秘密,我可以边打电话边看书))
异步就是我立刻挂了(既然不在那就算了,再也不听你的秘密了),至于你几时回来就与我没什么关系了。 (这里着重在于获取秘密 (即获取消息))
阻塞/非阻塞:
阻塞就是我要上官网买小米手机,由于量少,我必须一刻不停的在电脑前,手在不停的刷新网页,脑在不停的转动,眼睛不停的看着显示器,这个时候的我除非等到抢购完了(可能有也可能没有)我才能去做其他事。
非阻塞就是:爱买不买,当前没有我就去玩游戏了,偶尔再回来看看抢购结束没。
他们看起来有些类似,但其实应用的场景不一样,关注点也不一样
知乎有个不错的回答可以看看:怎样理解阻塞非阻塞与同步异步的区别?