java开发中IO阻塞、非阻塞、同步、异步漫画插画
周末在家加班,疯狂编码。女朋友拿着他刚画的漫画高兴地跑了过来。
同步、异步、阻塞、非阻塞都是与IO(输入输出)相关的术语。最简单的文件读取就是IO操作。读取文件的方法有很多种。
什么是同步和异步
说到烧水,我们都是通过水壶烧水。很久以前,科技还没有那么发达的时候,我们想要烧水就得把水壶放在炉子上。我们通过观察水壶中水的沸点来判断水是否沸腾。
随着技术的发展,现在市场上的锅炉都具有提醒功能。当我们连接水壶时,水壶中的水沸腾后,它会通过声音提醒我们水已沸腾。
关于烧水,传统锅炉是同步烧水,而高科技锅炉是异步烧水。
同步请求,A 调用 B,B 的处理是同步的。直到治疗完成他才会通知A。只有在处理完成后才会明确通知 A。
异步请求,A调用B,B的处理是异步的。 B收到请求后,首先告诉A自己收到了请求,然后异步处理。处理完成后,会通过回调等方式通知。 A.
所以同步和异步的主要区别在于执行的方式和调用者的返回时间。同步是指被调用者完成工作后返回,异步是被调用者先返回,然后做工作,完成后再想办法通知调用者。
什么堵,什么不堵
还是以烧水为例,当你把水放进水壶里,按下开关后,你就可以坐在水壶前面,什么都不做,继续等待。烧开水。也可以先到客厅看电视,等水烧开。
对你来说,坐在水壶前等待是阻塞,去客厅看电视等水烧开是非阻塞。
阻止请求,A 调用 B,A 等待 B 返回,不执行任何其他操作。
非阻塞请求,A调用B,A不需要等待B返回,可以先做其他事情。
所以同步和异步的主要区别在于调用者是否一直等待被调用者返回结果之前的一段时间。阻塞意味着调用者继续等待其他事情而不执行任何操作。非阻塞意味着调用者先去做其他事情。
阻塞、非阻塞、同步和异步的区别
首先,前面说过,阻塞、非阻塞、同步和异步实际上针对的是不同的对象。阻塞和非阻塞是指调用者,同步和异步是指调用者。
有人认为阻塞和同步是一样的,非阻塞和异步是一样的。但事实并非如此。
首先我们看一下同步场景中是如何包含阻塞和非阻塞情况的。
我们用传统的水壶烧水。水烧开之前,我们守在水壶前,等待水烧开。这会阻塞。
我们用传统的水壶烧水。水还没烧开,我们就到客厅看电视,但锅炉并没有主动通知我们。我们不得不时不时地去厨房看看水是否沸腾了。这是非阻塞的。
让我们看看异步场景如何包括阻塞和非阻塞情况。
我们用带有提醒功能的水壶来烧水。在警告到来之前,我们站在水壶前等待水沸腾。这会阻塞。
我们用带有提醒功能的水壶来烧水。在水壶发出提示音之前,我们就到客厅看电视,等待水壶发出提示音。这是非阻塞的。
Java中的三种IO模型
Java语言中,总共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO)。
这里的BIO和NIO都是同步IO模型,即同步阻塞IO和同步非阻塞IO。异步IO是指异步非阻塞IO。
BIO(Blocking I/O):同步阻塞I/O模式,读写数据必须阻塞在一个线程中等待其完成。
NIO(新I/O):同时支持阻塞和非阻塞模式,但主要使用同步非阻塞IO。
AIO(异步I/O):异步非阻塞I/O模型。
BIO(阻塞I/O):有多个水壶烧水。 BIO的工作模式是要求一个线程停留在一个水壶处,直到该水壶烧开后再处理下一个水壶。但实际上,线程在等待水壶沸腾时什么也不做。
NIO(新I/O):NIO的做法是让一个线程不断轮询每个锅炉的状态,看某个锅炉的状态是否发生了变化,以便继续下一步的操作。
AIO(异步I/O):每台锅炉上安装一个开关。当水烧开时,水壶会自动通知我水已烧开。
滴滴滴滴,这时候水壶响了,打断了男朋友的问题。我男朋友去拿热水并给我泡了一杯咖啡。
作者:漫画编程_公众号mhcoding
来源:掘金
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。