关于同步,异步一些事

前言

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

同步,异步概念

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

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

同步

咱们在食堂打饭,刷了饭卡后(发起一个调用),在没等到食堂阿姨给咱们饭菜的时候,咱们是不能走的,由于咱们刷了饭卡,扣了钱了,须要给我饭菜,我才能走,因此,在食堂打饭这就是同步调用线程

异步

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

阻塞,非阻塞概念

阻塞: 阻塞,是指调用结果返回以前,当前线程会被阻塞,调用结果返回后,当前线程才会返回 非阻塞: 非阻塞,在不能立刻获得调用结果以前,当前线程不会被阻塞回调函数

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

阻塞

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

非阻塞

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

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

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

同步,阻塞的区别

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

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

异步,非阻塞的区别

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

异步: 调用方,不须要等待调用结果的返回,在调用发出后,就返回了,没有结果,须要经过回调函数来返回结果 非阻塞: 线程,在结果没有返回的时候,处于运行状态,线程能够去作其余的

总结

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

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

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

老张以为本身聪明了。"所谓同步异步,只是对于水壶而言"。

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

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

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

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

状况1和状况3中老张就是阻塞的,由于在等待水开的过程当中,他不能作其余的。虽然3中响水壶是异步的,可对于等待水开的老张没有太大的意义。因此通常异步是配合非阻塞使用的,这样才能发挥异步的效用

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

  1. 同步阻塞: 发起调用,得不到结果就等待,而且阻塞当前线程,不能作其余的
  2. 同步非阻塞: 发起调用,得不到结果就等待,当前线程不会被阻塞,依旧会处于运行状态,能够去作其余的
  3. 异步阻塞: 发起调用,不等待结果返回,可是当前线程会被阻塞,不能作其余的
  4. 异步非阻塞: 发起调用,不等待结果返回,当前线程能够作其余的
相关文章
相关标签/搜索