浅谈Java中BIO、NIO和AIO的区别和应用场景
最近一直在准备面试,为了使自己的java水平更上一个档次,拜读了李林峰老师的《netty权威指南》,了解了java关于io的发展和最新的技术,真是受益匪浅,现在把我总结的关于bio、nio和aio的区别和应用场景概述一遍。
在此之前,先弄清几个概念:
1.同步:使用同步io时,java自己处理io读写。
2.异步:使用异步io时,java将io读写委托给os处理,需要将数据缓冲区地址和大小传给os,完成后os通知java处理(回调)。
3.阻塞:使用阻塞io时,java调用会一直阻塞到读写完成才返回。
4.非阻塞:使用非阻塞io时,如果不能立马读写,java调用会马上返回,当io事件分发器通知可读写时在进行读写,不断循环直到读写完成。
下面是重点了(敲黑板!)!
1.bio:同步并阻塞,服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:由于客户端连接数与服务器线程数成正比关系,可能造成不必要的线程开销,严重的还将导致服务器内存溢出。当然,这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。
2.nio:在jdk1.4以前,java的io模型一直是bio,但从jdk1.4开始,jdk引入的新的io模型nio,它是同步非阻塞的。而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器selector上,多路复用器轮询到连接有io请求时才启动一个线程处理。
3.aio:jdk1.7发布了nio2.0,这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的io请求都是由os先完成再通知服务器应用去启动线程处理(回调)。
应用场景:并发连接数不多时采用bio,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择nio或aio,更好的建议是采用成熟的网络通信框架netty。
以上所述是小编给大家介绍的java中bio、nio和aio的区别详解整合,希望对大家有所帮助