关于同步,异步一些事

原创
2019/06/25 00:40
阅读数 108

前言

其实,同步,异步的知识点,我是知道的,但是其中同步还分同步阻塞,同步非阻塞,异步阻塞,异步非阻塞这里面我有些却了解的却不是很清楚,最近跟朋友讨论这块,才发现,盲点不少,借此,想写下这篇,记录下学习跟理解的过程,因此,我们需要先知道,什么是 同步异步,什么是 阻塞非阻塞

同步,异步概念

同步: 在发起一个调用的时候,没有拿过结果之前,调用不会返回
异步: 在发起一个调用的时候,不需要等待拿到结果,调用直接返回,通过回调函数返回结果

从上面我们大概能理解了什么是同步异步了,但是解释的不算接地气,我们打算举个更接地气的例子

同步

我们在食堂打饭,刷了饭卡后(发起一个调用),在没等到食堂阿姨给我们饭菜的时候,我们是不能走的,因为我们刷了饭卡,扣了钱了,需要给我饭菜,我才能走,所以,在食堂打饭这就是同步调用

异步

我们不在食堂吃饭,我们在外面的饭店吃饭,在收银员那点餐付款(发起一个调用)后,收银员会给我们一个牌子,我们找个位置坐下来,后面会有服务员通过牌子找到我们,把饭菜端上来给我们(异步回调),因为我们已经付款了,并且给了牌子,后面服务员可以通过牌子找到我们,我不需要一直在收银员那等着告诉我结果,可以直接找位置坐下来,所以在饭店吃饭是异步

阻塞,非阻塞概念

阻塞: 阻塞,是指调用结果返回之前,当前线程会被阻塞,调用结果返回后,当前线程才会返回 非阻塞: 非阻塞,在不能马上得到调用结果之前,当前线程不会被阻塞

在上面,我们大概能理解了,什么是阻塞非阻塞,但是解释的不算接地气,我们打算举个更接地气的例子

阻塞

你打电话给小区内的一家饭店,想问问有没有西红柿鸡蛋盖饭,老板告诉你,要去厨房看一下,有没有西红柿跟鸡蛋了,如果你是阻塞调用,那么你就要在电话旁边一直等着,直到得到是否有西红柿鸡蛋盖饭这个结果,你一直等着结果,就是阻塞

非阻塞

还是同样的故事,你打电话给小区内饭店老板,如果你是非阻塞调用,那么你可以把手机开扩音,放旁边,可以玩其他的,偶尔你也要关注饭店老板反馈给你的信息,看看有没有西红柿跟鸡蛋,在等结果的同时,你还能玩其他的,就是非阻塞

同步,异步,阻塞,非阻塞之间的差异

在上面,我们介绍了关于 同步,异步,阻塞,非阻塞,同时我们发现 同步阻塞,异步非阻塞的定义好像很像,但是实际上,他们不是一个东西,同步异步关注的是消息通信阻塞非阻塞关注的是线程在等待调用结果时的状态,两者关注的点不一样,因此,我们不要混淆了概念

同步,阻塞的区别

我总结一下,同步 阻塞 的差异跟关注点

同步: 调用方,主动等待结果的返回 阻塞: 线程,在结果没有返回的时候,会被阻塞,只要有等结果返回之后才运行,换言之,就是线程处于阻塞状态

异步,非阻塞的区别

我总结一下 异步 非阻塞 的差异跟关注点

异步: 调用方,不需要等待调用结果的返回,在调用发出后,就返回了,没有结果,需要通过回调函数来返回结果 非阻塞: 线程,在结果没有返回的时候,处于运行状态,线程可以去做其他的

总结

举个例子,来描述下上述总结的内容

出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)

  1. 老张把水壶放到火上,等待水开(同步阻塞)
  2. 老张把水壶放到火上,然后去客厅看电视,并且时不时的去厨房看看水有没有烧开(同步非阻塞)
  3. 老张把响水壶放到火上,等待水开(异步阻塞)
  4. 老张把响水壶放到火上,然后去客厅看电视,水壶响之前,不会去厨房看水有没有烧开,等水壶响了再去看(异步非阻塞)

老张觉得自己聪明了。"所谓同步异步,只是对于水壶而言"。

  1. 普通水壶,同步;
  2. 响水壶,异步.

虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下.

所谓阻塞非阻塞,"仅仅对于老张而言"。

  1. 等待水开的老张,阻塞.
  2. 看电视的老张,非阻塞.

情况1和情况3中老张就是阻塞的,因为在等待水开的过程中,他不能做其他的。虽然3中响水壶是异步的,可对于等待水开的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用

从上面的例子,我们应该能理解了关于同步 异步 阻塞 非阻塞的概念了,同步/异步是对用获取水开的方式不同,阻塞/非阻塞是对于等待水开的过程中,能否去做其它事情,因此我总结了一下前言提到的 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

  1. 同步阻塞: 发起调用,得不到结果就等待,并且阻塞当前线程,不能做其他的
  2. 同步非阻塞: 发起调用,得不到结果就等待,当前线程不会被阻塞,依旧会处于运行状态,可以去做其他的
  3. 异步阻塞: 发起调用,不等待结果返回,但是当前线程会被阻塞,不能做其他的
  4. 异步非阻塞: 发起调用,不等待结果返回,当前线程可以做其他的
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部