同步、异步、阻塞和非阻塞的区别

今天跟旭哥聊到的并发的机制,深入了解到了同步异步阻塞非阻塞的区别,自己总结一下,加强理解,废话不多说,就是干。

提出问题

同步和异步的区别是什么?
阻塞和非阻塞的区别是什么?
你可以尝试在脑子里想一下这个问题,先有自己的答案,然后再往下看






来看一下答案
同步和异步的关注点的是值的返回方式,
同步是服务方处理完后再响应用户。
而异步是服务方当前就先返回一个收到请求的值,然后真正处理完再返回结果,或者调用方再请求拉取结果。
阻塞和非阻塞的关注点是调用方的状态
阻塞是在服务方处理时,调用方的状态是什么都不干。
而非阻塞是在服务方处理时,调用方去干自己的事情,不在这干等着,调用方自己去查询结果,或者有结果时服务方通知调用方。

优缺点

阻塞
优点:能及时返回数据,没有延迟。
缺点,需要付出等待的时间代价。
非阻塞
优点:与阻塞比较,非阻塞不需要等待任务结果, 可以去执行其他任务,所以对并发的支持比较好。
缺点:不能及时的获取返回结果。因为每隔一段时间才回去询问,但是可能在两次询问动作的时间间隔内任务就可能完成了,这回导致整体数据的吞吐量的降低。

组合后的场景

我们来通过例子看下组合后的场景
同步、异步、阻塞和非阻塞的区别
同步阻塞
就是小明去无名缘吃米线,点了一个肉沫米线,服务员说大概半个小时可以做好,你得等一会。然后小明什么都不干就在这等着,等做好了再去干找座位。
BIO就是同步阻塞模式,我们的写的大部分方法都是同步阻塞的。
同步非阻塞
还是这个例子,
就是在师傅在坐米线同时,小明也没闲着,他去了个座位,他刷了会手机,但是每过10分钟,他都去看一下饭做好了没。
NIO就是同步非阻塞模式,
异步非阻塞
继续
小明点完米线,服务员给了小明一个号,说米线好了我喊你,然后小明就去找座位记单词了。
AIO是异步非阻塞模式,Callable和一些带有回调方法的都是异步非阻塞模式。
异步阻塞
这种方式很傻,一般没人会去用