java基础:12、BIO、NIO、AIO有什么区别?

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代码示例

?待补链接

发布了57 篇原创文章 · 获赞 13 · 访问量 1128

猜你喜欢

转载自blog.csdn.net/weixin_42924812/article/details/105053568