其实,同步,异步的知识点,我是知道的,可是其中同步还分同步阻塞
,同步非阻塞
,异步阻塞
,异步非阻塞
这里面我有些却了解的却不是很清楚,最近跟朋友讨论这块,才发现,盲点很多,借此,想写下这篇,记录下学习跟理解的过程,所以,咱们须要先知道,什么是 同步跟异步,什么是 阻塞跟非阻塞异步
同步: 在发起一个调用的时候,没有拿过结果以前,调用不会返回
异步: 在发起一个调用的时候,不须要等待拿到结果,调用直接返回,经过回调函数返回结果函数
从上面咱们大概能理解了什么是同步跟异步了,可是解释的不算接地气,咱们打算举个更接地气的例子学习
咱们在食堂打饭,刷了饭卡后(发起一个调用),在没等到食堂阿姨给咱们饭菜的时候,咱们是不能走的,由于咱们刷了饭卡,扣了钱了,须要给我饭菜,我才能走,因此,在食堂打饭这就是同步调用线程
咱们不在食堂吃饭,咱们在外面的饭店吃饭,在收银员那点餐付款(发起一个调用)后,收银员会给咱们一个牌子,咱们找个位置坐下来,后面会有服务员经过牌子找到咱们,把饭菜端上来给咱们(异步回调),由于咱们已经付款了,而且给了牌子,后面服务员能够经过牌子找到咱们,我不须要一直在收银员那等着告诉我结果,能够直接找位置坐下来,因此在饭店吃饭是异步code
阻塞: 阻塞,是指调用结果返回以前,当前线程会被阻塞,调用结果返回后,当前线程才会返回 非阻塞: 非阻塞,在不能立刻获得调用结果以前,当前线程不会被阻塞回调函数
在上面,咱们大概能理解了,什么是阻塞跟非阻塞,可是解释的不算接地气,咱们打算举个更接地气的例子同步
你打电话给小区内的一家饭店,想问问有没有西红柿鸡蛋盖饭,老板告诉你,要去厨房看一下,有没有西红柿跟鸡蛋了,若是你是阻塞调用,那么你就要在电话旁边一直等着,直到获得是否有西红柿鸡蛋盖饭这个结果,你一直等着结果,就是阻塞效率
仍是一样的故事,你打电话给小区内饭店老板,若是你是非阻塞调用,那么你能够把手机开扩音,放旁边,能够玩其余的,偶尔你也要关注饭店老板反馈给你的信息,看看有没有西红柿跟鸡蛋,在等结果的同时,你还能玩其余的,就是非阻塞总结
在上面,咱们介绍了关于 同步,异步,阻塞,非阻塞,同时咱们发现 同步跟阻塞,异步跟非阻塞的定义好像很像,可是实际上,他们不是一个东西,同步跟异步关注的是消息通讯
而阻塞跟非阻塞关注的是线程在等待调用结果时的状态
,二者关注的点不同,所以,咱们不要混淆了概念通信
我总结一下,同步 阻塞 的差别跟关注点
同步: 调用方,主动等待结果的返回 阻塞: 线程,在结果没有返回的时候,会被阻塞,只要有等结果返回以后才运行,换言之,就是线程处于阻塞
状态
我总结一下 异步 非阻塞 的差别跟关注点
异步: 调用方,不须要等待调用结果的返回,在调用发出后,就返回了,没有结果,须要经过回调函数来返回结果 非阻塞: 线程,在结果没有返回的时候,处于运行
状态,线程能够去作其余的
举个例子,来描述下上述总结的内容
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)
老张以为本身聪明了。"所谓同步异步,只是对于水壶而言"。
虽然都能干活,但响水壶能够在本身完工以后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询本身(状况2中),形成老张效率的低下.
所谓阻塞非阻塞,"仅仅对于老张而言"。
状况1和状况3中老张就是阻塞的,由于在等待水开的过程当中,他不能作其余的。虽然3中响水壶是异步的,可对于等待水开的老张没有太大的意义。因此通常异步是配合非阻塞使用的,这样才能发挥异步的效用
从上面的例子,咱们应该能理解了关于同步 异步 阻塞 非阻塞的概念了,同步/异步是对用获取水开的方式不一样,阻塞/非阻塞是对于等待水开的过程当中,可否去作其它事情,所以我总结了一下前言提到的 同步阻塞
,同步非阻塞
,异步阻塞
,异步非阻塞
运行
状态,能够去作其余的