同步,异步,阻塞,非阻塞的区别
前言
此内容来自于Hollis的文章, 我觉得解释的很通俗易懂, 所以就抄一下. 这里也推荐想扩展知识的可以去看看, 抖音博主Hollis, 橱窗的八股文 . 虽然定位是八股文, 但内容是很抗打的, 我也买了,觉得还是不错的
正文
在很多关于中间件或者网络传输的时候会提到io模型,什么BIO, NIO , AIO 的, 虽然大概知道模型的意思和功能, 但对原理还是模模糊糊, 网络上的文章又写的太复杂, 压根就懒得看 , 诶, 以下的解释就一眼就明白了
同步与异步描述的是被调用者的
譬如A调用B
如果是同步,B在接到A的调用后,会立即执行要做的事。A的本次调用可以得到结果。
如果是异步,B在接到A的调用后,不保证会立即执行要做的事,但是保证会去做,B在做好了之后会通知A。A的本次调用得不到结果,但是B执行完之后会通知A。
阻塞与非阻塞描述的是调用者的
A调用B
如果是阻塞,A在发出调用后,要一直等待,等着B返回结果。
如果是非阻塞,A在发出调用后,不需要等待,可以去做自己的事情。
同步不一定阻塞,异步也不一定非阻塞。没有必然关系。
举个简单的例子,老张烧水:
1. 老张把水壶放到火上,一直在水壶旁等着水开。(同步阻塞)
2. 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
3. 老张把响水壶放到火上,一直在水壶旁等着水开。(异步阻塞, 这里变为了响水壶, 也就是模型响应事件已经变了)
4. 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)