天天看点

同步异步与阻塞非阻塞的区别

问题源于知乎 怎样理解阻塞非阻塞与同步异步的区别?

以下乃个人见解,如有不对之处,欢迎指出讨论。

概念

同步异步是形容结果的通知形式。通知形式!主动/被动。

阻塞和非阻塞是形容客户端在接受到结果之前的自身状态。

一个是状态,一个是形式。

组合

毫无疑问可以进行组合。2*2=4种结果。

我们最常用的两种组合:

同步阻塞:网络请求的同步形式。主动获取结果,并且获取到结果前其他同线程操作不会执行。

异步非阻塞:网络请求的异步形式。结果靠通知,并且发出请求后就执行其他操作去了。

比较不长见的两种形式:

1.同步非阻塞

典型的就是协程(kt),我记得协程的主打特色就是同步非阻塞。实际上本质还是异步,只不过看着形式是同步。(这不是正好对应了前面对应的异步同步只是形式)。这种组合少的原因一般是不好写吧(我猜)

2.异步阻塞

异步了还阻塞,这不神经病吗?

对于网络请求就是用异步的请求,但是主线程wait住直到接口回调。。。。这tm还不如直接用同步呢,用异步反而复杂了。这种组合少的原因是蠢,会被评价为弱智代码(除非这个操作只能异步,但是其他所有操作又必须等这个操作完成。真出现这种操作,只能说这个操作设计的有问题。)