同步,异步,阻塞,非阻塞的概念

同步与异步是关于指令(程序)执行顺序的概念:比如你的一段代码里面有A,B两个函数。

同步就是你调用A函数,需要一直等待A函数返回调用结果之后再去执行B函数

异步就是你在调用A之后,不等待A返回结果,而是直接去调用B函数,待A函数执行完成之后,再通过状态,通知或者是回调等机制来通知你调用的结果

阻塞与非阻塞是对线程\进程来说的概念:

阻塞指的是在等待调用结果返回之前,进程一直处于挂起状态,不能执行其他业务

非阻塞指的是进程等待调用结果时,进程并没有挂起,而是去执行了其他业务

同步,异步与阻塞,非阻塞之间并没有必然的联系:

比如:有些程序在执行同步调用的时候,并没有被CPU挂起而是一直处于激活状态,所以这个程序在等待调用返回时并没有处于阻塞状态。

再比如:如果使用异步的方式去调用一个函数A,在调用之后你执行了sleep函数,这时你的程序就处于异步阻塞的状态

同步,异步,阻塞,非阻塞一共可以组成4中状态的程序,下面由一个生活中的例子来说明:

同步阻塞:你去肯德基柜台点了一份汉堡,然后你就啥也不敢一直在柜台前等待汉堡的制作完成

同步非阻塞:你去肯德基柜台点了一份汉堡,在柜台前等待的时候你点开了手机玩起了游戏,等待汉堡的制作完成

异步阻塞: 你去肯德基柜台点了一份汉堡,然后不在柜台等着,而是找了个座位休息,然后隔断时间就跑到柜台前问服务员自己的汉堡制作好了没

异步非阻塞:你去肯德基柜台点了一份汉堡,然后不在柜台等着,而是找了个座位休息,然后一直刷手机,直到服务员通知你汉堡制作好了


新的理解:

同步就是当你发起调用之后,被调用者处理完成之后,才给你返回处理结果

异步就是当你发起调用之后,就不再理睬被调用者,而是等待被调用者通过状态、通知或者是回调等机制来通知你调用的结果

阻塞就是当你发起调用之后,在被调用者处理数据期间,你啥时也不敢,就这么等着

非阻塞就是当你发起调用之后,在被调用者处理数据期间,你没有傻等着,而是干了其他的事

参考文章:

https://github.com/calidion/calidion.github.io/issues/40

https://www.jianshu.com/p/aed6067eeac9


书山有路勤为径 学海无涯苦作舟