文章目录
BIO、NIO、AIO有什么区别?
1、简述
BIO:同步阻塞式IO。(Blocking IO)
NIO:同步非阻塞 IO。(NonBlocking IO)
AIO:异步非阻塞IO。(Asynchronous IO)
BIO适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
同步与异步
同步:发起一个调用后,被调用者未处理完请求之前,调用不返回。
异步:调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。
阻塞与非阻塞
阻塞:发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
非阻塞:发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。
2、BIO
BIO概念
BIO就是传统的IO,通过传统的Socket来实现最基本的网络通信功能。以服务器端为例,Socket基本流程如下:
(1)open:打开ServerSocket连接
(2)accept:接受连接
(3)read:读取数据
(4)send:发送数据
(5)close:关闭资源
客户端与服务端三次握手。关键词:Socket和ServerSocket;
如果客户端还没有对服务器端发起连接请求,那么accept就会阻塞。如果连接成功,数据没有准备好时,对read的调用就会阻塞。同时处理多个连接时,就需要采取多线程的方式。由于每个线程都有自己的栈空间,阻塞会导致大量线程进行上下文切换,减低效率。
BIO工作模式如下图所示:
BIO应用场景
BIO适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
BIO代码示例
?待补链接
3、NIO
NIO概念
BIO是面向流的,而NIO是面向缓存的。NIO通过Channel、Selector、Buffer来实现非阻塞的IO操作,采用了Reactor设计模式。
NIO中,客户端与服务端通过Channel连接,采用选择器轮询注册的Channel。关键词:SocketChannel和ServerSocketChannel;
Channel是一个双向的非阻塞通道,通道两边都可以进行数据的读写。与Buffer进行交互。
Selector类似一个观察者。对所有的Channel进行轮询访问,来进行对数据的读写操作。使用单个线程实现对多个通道的访问,不需要多个线程之间上下文的切换,所以选择器提高了效率。
Buffer是缓冲区,用来存放数据。在读取和写出数据,都是在缓冲区进行。任何时候访问NIO中的数据,都是通过缓冲区进行操作。Buffer有ByteBuffer、CharBuffer等。
NIO工作模式如下图所示:
NIO应用场景
NIO适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
NIO代码示例
?待补链接
4、AIO
AIO概念
异步非阻塞通信。在NIO的基础上引入了异步通道的概念。
AIO是基于事件和回调机制,采用异步通道实现异步通信。关键词:AsynchronousSocketChannel和AsynchronousServerSocketChannel。
AIO应用场景
AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
AIO代码示例
?待补链接