当前位置: 首页 > article >正文

BIO、NIO、AIO 有什么区别?

BIO、NIO、AIO 有什么区别?

1. BIO(Blocking I/O) - 阻塞式 I/O

特点:

示例:

2. NIO(Non-blocking I/O) - 非阻塞 I/O

特点:

示例:

3. AIO(Asynchronous I/O) - 异步 I/O

特点:

示例:

4. 总结对比

使用建议:


🎈边走、边悟🎈迟早会好

BIO(Blocking I/O)NIO(Non-blocking I/O)AIO(Asynchronous I/O) 是 Java 中处理 I/O 操作的三种不同模型,主要区别在于 I/O 操作的阻塞方式和编程模式。下面是它们的详细区别:

1. BIO(Blocking I/O) - 阻塞式 I/O

BIO 是最传统的 I/O 模型,通常使用在较早的 Java 应用中(如 Java 1.4 之前)。在 BIO 模式下,I/O 操作是阻塞的,也就是说,当程序执行某个 I/O 操作(如读取或写入)时,会阻塞当前线程,直到该操作完成。

特点:
  • 阻塞模式:一个线程处理一个连接,在 I/O 操作完成之前,线程会一直被阻塞。
  • 简单、易理解:编程模型简单,每个客户端连接对应一个线程。
  • 性能瓶颈:当连接数量较大时,每个连接都需要一个线程来处理,会导致线程资源耗尽,系统性能下降。
  • 适用场景:适合连接数量少、业务逻辑简单的场景,比如早期的 Web 服务器或数据库连接。
示例:
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
    Socket socket = serverSocket.accept();  // 阻塞等待客户端连接
    // 处理客户端请求...
}

2. NIO(Non-blocking I/O) - 非阻塞 I/O

NIO 是在 Java 1.4 中引入的,提供了非阻塞 I/O 操作。在 NIO 模式下,I/O 操作不会阻塞线程,线程可以在等待 I/O 完成的同时做其他事情。NIO 使用了 Selector 来监控多个通道(Channel),从而实现单线程处理多个连接的能力。

特点:
  • 非阻塞模式:线程可以请求某个通道的 I/O 操作,并在 I/O 操作无法立即完成时立即返回,而不会阻塞。
  • 多路复用:通过 Selector 进行 I/O 多路复用,一个线程可以管理多个 I/O 通道,减少线程数量,提高资源利用率。
  • 复杂度较高:相比 BIO,编程模型复杂,处理数据时需要手动维护通道的状态。
  • 适用场景:适合高并发、多连接的场景,如聊天服务器、Web 服务器等。
示例:
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    selector.select();  // 阻塞等待有通道准备好
    Set<SelectionKey> selectedKeys = selector.selectedKeys();
    for (SelectionKey key : selectedKeys) {
        if (key.isAcceptable()) {
            // 处理新的连接请求
        } else if (key.isReadable()) {
            // 处理读事件
        }
    }
}

3. AIO(Asynchronous I/O) - 异步 I/O

AIO 是 Java 7 引入的异步 I/O 模型,完全异步非阻塞。在 AIO 模式下,I/O 操作是异步的,应用程序发出 I/O 请求后,操作系统会在 I/O 操作完成后通知应用程序或回调特定方法,而不是立即等待 I/O 完成。

特点:
  • 完全异步非阻塞:I/O 操作完成后会有回调机制来通知,线程不需要一直等待。
  • 编程模型简单:相比 NIO,AIO 模式下的编程更简洁,不需要手动轮询 Selector
  • 更适合长时间的 I/O 操作:比如需要等待网络响应时间较长的场景。
  • 适用场景:高并发、需要处理大量连接的场景,但对于短连接场景,优势并不明显。
示例:
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));

serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
    @Override
    public void completed(AsynchronousSocketChannel result, Object attachment) {
        // 处理新的连接
        serverSocketChannel.accept(null, this);  // 接收下一个连接
    }

    @Override
    public void failed(Throwable exc, Object attachment) {
        // 处理失败
    }
});

4. 总结对比

特性BIO(阻塞 I/O)NIO(非阻塞 I/O)AIO(异步 I/O)
I/O 模型阻塞非阻塞,多路复用异步、回调通知
并发处理每个连接一个线程单线程管理多个连接通过回调处理多个连接
编程复杂度简单较复杂适中
适用场景低并发、简单请求高并发、大量短连接高并发、大量长时间连接
性能低,线程资源消耗大较高,但编程复杂度高高,线程消耗低,适合高并发

使用建议:

  • BIO:适合小型、简单的系统,或者连接数较少的应用。
  • NIO:适合高并发、大量短连接的系统,典型如网络服务器、聊天系统。
  • AIO:适合高并发、大量长时间操作的场景,比如需要处理大量 I/O 请求的系统。

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好


http://www.kler.cn/news/294235.html

相关文章:

  • 进程间通信-进程池
  • 《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 09部署OSPF
  • 前向代理和反向代理的区别是什么?
  • JWT详解:一种轻量级的身份验证和授权机制
  • 2024年AI芯片峰会——边缘端侧AI芯片专场
  • 力扣172.阶乘后的0
  • elasticsearch文档Delete By Query API(一)
  • 蚂蚁数科独立后首度公布业务进展和战略布局
  • 已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?
  • 网页时装购物系统:Spring Boot框架的高效实现
  • 《Foundation 滑块》
  • Codeforces Round 971 (Div. 4) A~G2
  • 【网络安全】CSRF漏洞—CSRF基础漏洞防御
  • linux系统中,计算两个文件的相对路径
  • class 6: vue.js 3 组件化开发
  • SpringBoot学习(4)(yml配置信息书写和获取)(SpringEL表达式语言)
  • 零工市场小程序:自由职业者的日常工具
  • HarmonyOS开发实战( Beta5版)延迟加载lazy-import实践使用指导
  • 探索EasyCVR与AI技术深度融合:视频汇聚平台的新增长点
  • 华为 HCIP-Datacom H12-821 题库 (8)
  • 香港服务器机房托管:优化全球访问体验的最佳选择
  • laravel command 执行自定义命令 choice 以后使用info 中文乱码
  • 2024全国大学生数学建模竞赛B题完整论文讲解
  • prometheus删除指定metrics下收集的值
  • MES系统:现代工厂生产车间的科技与管理创新
  • GAN 干!!!!
  • Qt 去掉QDialog对话框的问号
  • 【GD32】外部存储器控制器(EXMC)驱动16位8080时序并口屏(GD32F470ZGT6)
  • 企业级WEB应用服务器---TOMACT
  • LeetCode --- 413周赛