阻塞IO、非阻塞IO、同步IO、异步IO

阻塞IO、非阻塞IO、同步IO、异步IO

困而学,学而知

JavaIO浅析中,我们说了Java中关于IO的一些基本知识。什么是Java IO,为什么要使用IO以及IO流的分类。文中也有提到,IO操作的来源地和目的地可能是文件、内存块或者网络。本文先来说说几个很重要但也很容易搞混淆的几个知识点:阻塞IO、非阻塞IO、同步IO、异步IO

阻塞IO、非阻塞IO、同步IO、异步IO

BIO的直接意思就是阻塞IO。BIO这个名词可能大家都听说过,也有很多同学知道是什么意思。也会把阻塞IO、非阻塞IO、同步IO、异步IO等概念拿到一起说,关于这种文章网上也有很多,但是为了能够让读者更好理解,也为了文章的完整性(字数),我们还是要来讲讲这几个概念。

  • 阻塞IO: 程序调用某资源时,IO线程会挂起(阻塞),直到有返回结果
  • 非阻塞IO: 程序在调用某资源时,IO线程不会挂起(不阻塞),会立即返回结果。
  • 同步IO:程序在发出一调用时,在没有得到结果之前,该调用就不返回。
  • 异步IO:调用在发出之后,这个调用就直接返回了,所以没有返回结果。

如果只是看上面的四句话,我相信有很多同学都不知道再讲什么?且好像阻塞与同步意思差不多,非阻塞和异步意思差不多。其实不然,阻塞/非阻塞与同步/异步关注点是不一样的。

阻塞与非阻塞关注的是程序在等待结果时的状态。阻塞调用是在程序在发起调用之后,在调用结果返回之前,程序会一直挂起等到调用结果返回。而非阻塞是指在不能获取调用结果之前,程序不会被阻塞(可能去做其他事情了)。

同步与异步关注的是消息通信机制 。意思就是说,同步IO,在发起调用之后,如果没有获取到结果之前,调用就不会又返回。但是一旦调用返回,就得到返回值了。换句话说,**就是由调用者主动等待这个调用的结果。**而异步则是,立即返回,不会等待这个调用结果,,而是通过被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

也就是说,阻塞和非阻塞描述的是获取资源的方式,同步和异步描述的程序如何处理资源的逻辑

我们还可以这么理解:

同步IO和异步IO的区别就在于:应用程序的调用是否立即返回!

阻塞IO和非阻塞IO的区别就在于:数据访问的时候进程是否阻塞!

默认情况下,所有的IO都是阻塞的。

形象举例

去餐厅点餐,点餐之后,我们可以傻傻的站在老板面前,等到老板把饭做好送到你面前。

这里我们傻傻的等老板做好饭就是阻塞,而老板做饭就然后送给你的过程就是同步(需要等到调用返回)。

我们也可以点好餐之后,不等饭做好,直接去找座位,等老板做好了叫你。这时,我们可以去做点其它事情,当然了,需要偶尔问问问老板饭做好了没有。

这里的点好餐,去找座位,等老板做好了叫你过程就是异步。我们去做其他事情,偶尔问问老板饭做好了没有的过程就是非阻塞

这上面就是我理解的阻塞和非阻塞,同步/异步。如果我的理解有什么不对或者大家有什么新的看法,可以在评论去留言哟.

请大家不吝赐教,相互交流

简单总结一下,上面说了阻塞和非阻塞,同步/异步四个关键知识点的定义与区别,也详细了分析了一下这四个属性到底是怎么回事。在理解阻塞和非阻塞的时候,我们从应用程序调用时等到结果的状态来关注,在理解同步和异步的时候,从应用需要等待返回结果的角度理解,可能就会很好理解一些。这些关注点也是阻塞、非阻塞、同步和异步四个知识点的着重关注点。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://baozi.fun/archives/bio-nio-synchronized-asynchronized

Buy me a cup of coffee ☕.