天天看点

聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果

作者:程序员叶伟

聊聊日常开发中的BIO、NIO、AIO。

BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果没有涉及到网络编程或者是做架构,基本上也不会接触的到。但是只要谈到IO大家就比较熟悉了。

总的来说就是输入输出,API的请求,组建之间的通信,访问的应用程序,应用程序访问数据库缓存全是I0。在整个的服务端请求的过程中,IO可以说每个地方都有。

说到IO不得不说两个常见的IO模型了,一个是BIO,一个就是NIO,当然后面还有AIO。这其实也是属于NIO的一个范畴,它是基于NIO做了一个升级。

BIO是阻塞I0,是比较传统的网络IO模型。在BIO中的服务器跟客户端都会阻塞,早期的像tomcat中接收到。比如web浏览器发送的请求,就会在web服务器就会new一个线程来处理请求。

为什么说它会阻塞?因为在请求的整个的过程中,服务器还是客户端,就会一直等待整个请求,完成之后才能够继续执行下一步的操作。所以在整个的过程中它就是一个阻塞的状态。

这样就会引来一系列的问题。比如说请求越多服务端启用的线程也会越来越多。很多的线程如果有并发的状态下面,就会处于一种阻塞的状态。如果超过一定的阈值,可能就会导致整个的服务端请求超时,或者是整个应用的卡死。所以后来在JDK1.4就引入了NIO。

NIO通过引入像task、channel、buffer还有一些新的概念,来改善传统的IO的工作模式。

在NIO中解决最大的问题就是它的阻塞问题。服务端客户端是通过等待io事件的发生而不是像BIO那样直接阻塞对吧?

当然请求进来的时候是先会让请求进入叫做buffer的缓冲区,然后通过陌陌来判断应该复用哪个线程。有需要处理的事件发生时服务器或者客户端才会进行相应的处理,而不是每次请求进来都先去new一个线程。这种优化更多的是依赖于多路复用的方式来提高了并发处理的能力。

AIO就是异步I0了,这个是在JDK1.7引入的新特性。AIO相较于NIO来讲更加强调了I0在异步处理的能力。服务端和客户端发送了IO请求后不需要等待结果的返回,而是继续进行其他的操作。当IO操作完成之后系统会通知用户进行后续的处理,这个就是相当于一种回调的处理方式。

这种一步的处理方式当然性能也是最好的,因为它不需要等待处理结果而直接去进行了处理的返回。在实际的应用场景中怎么去选择IO模型?BIO开销太大了,所以它其实用的并不是很多。当然早期的有一些应用程序也可以结合线程池来做些优化,其实也是可以的。

目前大部分的场景还是用的NIO可以处理大量的并发请求,常见的就是各种IM聊天组件基于netty对吧?其实本质也是基于NIO,还有像Tomcat默认的也都是采用了NIO的IQ模式。

本期的视频就这些了,如果您对本期的内容有任何疑问欢迎大家在评论区给我留言,谢谢大家!

聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果
聊聊日常开发中的BIO、NIO、AIO。BIO、NIO是Java常见面试题。很多小伙伴在网络编程中经常会遇到的概念。如果