为什么异步IO不能完全取代阻塞IO
LanyuanXiaoyao's Blog ヽ(✿゚▽゚)ノ

为什么异步IO不能完全取代阻塞IO

2017-06-26

问题

问题链接:为什么异步IO不能完全取代阻塞IO

既然异步IO不会让线程阻塞,而且加上回调处理也很方便。为什么java还要用阻塞式IO呢?

回答

umm……首先,异步IO对应的应该是同步IO,阻塞IO对应的是非阻塞IO,虽然两组概念在思想上可以类比着理解,但是实际上是不同的两组东西,不能混着讲,就比如异步阻塞式,同步非阻塞这些方式都是存在的。 那么你想问的是什么呢?好吧╮(╯_╰)╭其实我也不知道,那我就都说说看……

同步/异步IO

这两个概念是针对消息的通知方式来说的

同步

就是在调用一个功能的时候,这个功能没有得出结果之前,都不会返回。 绝大部分Java方法都是同步的方式,对应生活中的情况也有很多啊,就是很多事情都是要有前提什么的,比如吃饭之前要先煮饭,拉屎(/◔ ◡ ◔)/之前要蹲下。就是当后面的功能需要用到前面的结果的时候,那不就只能等着呗。

异步

就是在调用一个功能的时候,不会立刻得到结果,等到这个功能出结果了,再通过消息、状态来通知一下调用者。 异步的方式在生活中也是很常见,比如你打电话问朋友有没有带纸,你上厕所忘记带纸了,朋友说你等等我去找找。那你是不是要一直等到朋友告诉你有没有纸呢,其实在等朋友告诉你有没有找到纸的这段时间里,还可以刷微博逛淘宝甚至是拉完拉到一半的屎……所以这就是异步的方式,在等一个结果的同时可以去干别的事。

总结

同步和异步两种方式的区别很明显,就是看你要做的两件事情是不是有着强烈的联系,如果两件事基本无关,比如朋友找厕纸和玩手机之间没有太大的联系,异步的调用方式就会很方便,如果后一件事需要前一件事的结果来做前提,那当然只能用同步的方式——等。

阻塞/非阻塞IO

这两个东西讲的是程序在等待消息时候的状态,无关同步还是异步

阻塞

就是线程在调用结果返回前都被挂起,直到有结果了才返回。 (´_`)是不是觉得和同步很像,其实我也是这样觉得的。不过事实上,同步调用中的等待结果返回,是逻辑上的没有数据返回,线程仍然处于激活的状态。 举个经典栗子,接收网络传输的数据的时候,假设我们定义一个符号是8个字节,那我们只有在流中累积到8个字节才一次读取这8个字节的数据

非阻塞

就是函数在不能立刻获取到结果的时候,也立刻返回。 承接上面的栗子,同样是8个字节的传输,加入流里只有4个字节的数据,非阻塞的调用就会直接返回4个字节的数据,另外4个字节的数据,那就等它们到了再来读取。

总结

阻塞和非阻塞两个概念指的是状态,就是在发现没有结果的时候会产生不同的处理方式,是等还是直接返回,这才是阻塞和非阻塞的区别。

混淆

其实非阻塞和异步这两个概念还是没有太大的问题的,毕竟异步是取得了结果还要回来通知调用者,而非阻塞就是当场就把结果返回,而不管结果是否完整。 容易混淆的就是同步和阻塞了吧,其实在处理的方式上,这两个概念其实就是差不多的,只不过实际上,同步是一个逻辑概念,阻塞是一个实际意义上的处理。

结束陈词

咳咳,这就是我的一些理解,纯手打可能不是很全面,有些意思还是表达地不好,希望能解答一些问题……


评论