又到了抠字眼的时间, 解释一下同步,异步,阻塞,非阻塞IO的区别

概念解释

同步

在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

异步

异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

他们之间的关系如图:

组合示例

同步阻塞

同步阻塞没啥好解释的了, 就是通常程序从上到下,从右到左, 从里到外的线性执行方式

当调用一个函数时, 需要等待函数执行完毕, 返回结果, 才能执行下一个

同步非阻塞

还是举一个例子吧, 你(程序), 烧了一壶水(调用一个函数), 因为烧开水需要时间, 因此你把水壶放火炉上就干别的了, 但是你担心把水烧干了, 因此你需要时不时的去看一眼(类似轮询) 直到烧开水 (返回结果), 这个时候你虽然可以干别的事情, 但是还是要操心水壶到底烧没烧开水, 是一种忙时等待状态

这个时候在烧水的时候你能干别的事情, 说明你没被阻塞

异步阻塞

还是用烧水举例, 异步阻塞就是你给水壶装了一个装置, 水烧开了就会发出响声通知你, 当然, 你得站在旁边等着, 区别就是因为是异步的, 你可以同时烧上三壶水, 每湖水烧开时都会通知你的

异步非阻塞

这个概念和异步阻塞已经很相似了, 区别就是在烧好几壶水时你可以做别的事情, 水烧开了自然会通知你, 到时候你再跑回来处理也不迟

总结

异步与同步是在被调用方考虑的 阻塞与非阻塞是站在调用方来考虑的

比如A调用B: A能在调用B后必须等到B的结果, 这是阻塞; 在B返回结果之前可以做其他事, 这是非阻塞

B必须计算完才能返回, 这叫同步; B被调用后立即返回, 但是得到结果后会产出回调或通知, 这叫异步

参考

并发、并行、同步、异步、阻塞、非阻塞