首先我们先来说一下同步与异步,以及阻塞与非阻塞。
同步主要指相互之间有着呼应的,做好准备的消息接收或者数据传递的发生,指的是双方都做好了准备,并且不停歇的回复对方。而异步是指接收方并没有做好接收信息的准备却收到了信息,或者不定时的发送信息出去。
阻塞与非阻塞主要是指对资源状态的一种反应,请求某一种资源时,若空缺,则一直固执等待,什么也不做,直到这种资源释放得到资源才行,其中等资源的过程叫做阻塞过程。若在等资源的时候,去做一些其他的事情,让时间充分利用以来,则是非阻塞。
有了这些概念的基础,我们就可以更好的理解BIO,NIO,AIO。
首先BIO是同步阻塞IO,B是Block的意思。NIO是同步非阻塞IO,N是new或者Non-Block的意思。AIO是异步非阻塞IO。下面用一个例子来更好的理解三者的含义。
首先去请求一个资源,若当前资源全部被占用,如果就一直等待一个资源释放,之后去利用这一资源,在等待资源过程中什么也不做,就是BIO。在等待资源过程中,去做一些其他的事情,当资源有时,就去占用。这是非阻塞过程,是NIO。
关于NIO是网络通信的一个重点,下面用一张图来解释它
当客户端即连接数增多时,他们都交给Selector去处理,可以理解为交给一个线程去处理,也就是多路复用的意思,之后多少个客户端则是分成多少个Channel。
当资源释放时,有一种异步的机制来告诉你资源已经有了,此时去占用资源,这是AIO。
理解了上述的关键词含义后,可以更好的提升自己技术与水平,在常见的面试中也会问道上述的问题。
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
BIO、NIO、AIO适用场景分析:
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。