区分阻塞与非阻塞&&同步与异步

这两对概念非常相似,但略有不同(阻塞与同步,非阻塞与异步易混淆)

引例

先来看几个例子。
天下文章一大抄,殊途同归嘛。从几篇比较好的文章上看到了例子,有助于理解。随后通过例子再自己总结一下。

例1

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

作者:严肃 链接:https://www.zhihu.com/question/19732473/answer/20851256 来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

例2

故事:老王烧开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
老王想了想,有好几种等待方式
1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。-同步阻塞
老王想了想,这种方法不够聪明。
2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。-同步非阻塞
老王想了想,现在的方法聪明了些,但是还是不够好。
3.老王这次使用高大上的响水壶来煮水,站在那里,但是不会再每隔一段时间去看水开,而是等水开了,水壶会自动的通知他。-异步阻塞
老王想了想,不会呀,既然水壶可以通知我,那我为什么还要傻傻的站在那里等呢,嗯,得换个方法。
4.老王还是使用响水壶煮水,跑到客厅上网去,等着响水壶自己把水煮熟了以后通知他。-异步非阻塞
老王豁然,这下感觉轻松了很多。

https://www.cnblogs.com/zihe/p/8323585.html

例3

  • 同步:今天你去超市买东西,你打电话问女友今天吃什么,然后女友说:"让我想一想,想一想~"这一想可能很长时间,你在旁边等着直到她说我想吃: “红烧肉”(结果返回)然后你就去买食材。
  • 异步: 你打电话问老妈红烧肉怎么做,她说:“有点麻烦,一时半会儿说不全(程序复杂,费时),等我理好思路之后给你发微信吧”(通过状态,通知或者回调函数通知调用者)。这时候你不用等待,去买其他东西了。(立即处理执行后面的程序)
  • 阻塞:你在超市食材区排队买肉,这时候货架上肉卖完了,需要等待售货员询问是否还有肉,这时候你就一直在等(线程被挂起),直到新的肉到来或者库存已空(结果返回)。
  • 非阻塞:你在超市除了想买食材还想买水果,买日用品等,这时候你不打电话了,发微信给女友说:“你想吃什么,想好告诉我,我正在超市买东西”。这时候你不用等她立即回复,你去买水果,日用品等,但主要目的买菜还没得到回复,所以你时不时的去看一下微信(轮询查看是否返回结果)

https://segmentfault.com/a/1190000016827291

总结

看了三个例子,感觉好像明白了,但又觉得和自己之前理解的没差多少,还又觉得同步异步和阻塞非阻塞不就是一回事么?所以,这四个东西到底是啥

  • 同步:请求方调用之后主动等待返回值
  • 异步:请求方调用之后去执行别的操作,被调用者执行完成后会通知请求方
  • 阻塞:请求方调用之后,线程会被挂起,直到拿到返回值为止
  • 非阻塞:请求方调用之后去执行别的操作,过程中请求方还需要时不时查看轮询被调用者是否执行完成

同步和阻塞都是在等待返回值的时候不能处理其他事情;异步和非阻塞区别在于对象不同,前者是被调用者通知请求方,后者是请求方要自己主动查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值