Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java章节编写规范
  • Java基础

  • Java集合

  • Java并发

  • Java IO

    • Java IO概述
    • IO基础

    • 常用IO流

    • 文件与目录操作

    • Java NIO

    • 高级主题

      • RandomAccessFile
      • 内存映射文件MappedByteBuffer
      • 零拷贝
      • BIO-NIO-AIO模型
        • 1. BIO
        • 2. NIO
        • 3. AIO
        • 4. 三者对比
        • 5. 为什么 NIO 更常见
        • 6. 如何选择
        • 专家实践清单
        • Tips 快问快答
        • 7. 总结
      • 字符集与乱码
      • 序列化安全与替代方案
    • 实践与性能优化

    • 面试与设计题

    • IO实践速查

  • JVM

目录

BIO-NIO-AIO模型

BIO、NIO、AIO 是 Java 网络 IO 中常见的三种模型。理解它们,有助于判断不同服务端架构的性能边界和复杂度。

# 1. BIO

BIO 是 Blocking IO,同步阻塞 IO。

典型模型:

一个连接 -> 一个线程 -> 阻塞读取 -> 处理请求 -> 写回响应

示例:

ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
    Socket socket = serverSocket.accept();
    new Thread(() -> handle(socket)).start();
}

优点:

  • 编程简单。
  • 逻辑直观。
  • 适合连接数少的场景。

缺点:

  • 连接多时线程数膨胀。
  • 阻塞线程浪费资源。
  • 上下文切换成本高。

# 2. NIO

NIO 是同步非阻塞 IO。

典型模型:

多个连接 -> Selector -> 少量线程处理就绪事件

优点:

  • 少量线程管理大量连接。
  • 适合高并发长连接。
  • 是 Reactor 模式基础。

缺点:

  • 编程复杂。
  • 半包、粘包、写队列、状态机都要处理。
  • 业务线程和 IO 线程要合理隔离。

# 3. AIO

AIO 是 Asynchronous IO,异步 IO。

Java 中相关类:

  • AsynchronousFileChannel
  • AsynchronousSocketChannel
  • AsynchronousServerSocketChannel

示例:

AsynchronousFileChannel channel = AsynchronousFileChannel.open(
        Path.of("data.txt"),
        StandardOpenOption.READ);

ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<>() {
    @Override
    public void completed(Integer result, ByteBuffer attachment) {
        attachment.flip();
        // process data
    }

    @Override
    public void failed(Throwable exc, ByteBuffer attachment) {
        exc.printStackTrace();
    }
});

AIO 的特点是发起操作后立即返回,完成后通过回调通知。

# 4. 三者对比

模型 全称 特点 适合场景
BIO Blocking IO 同步阻塞,一个连接常配一个线程 简单低并发
NIO Non-blocking IO 同步非阻塞,多路复用 高并发网络
AIO Asynchronous IO 异步回调 特定异步文件或网络场景

# 5. 为什么 NIO 更常见

在 Java 服务端生态中,NIO 比 AIO 更常见,主要原因是:

  • Reactor 模型成熟。
  • Netty 等框架生态强大。
  • Linux 下异步 IO 支持历史上并不总是理想。
  • NIO 可控性强,性能和复杂度之间平衡较好。

因此很多高性能 Java 网络框架选择 NIO,而不是直接基于 AIO。

# 6. 如何选择

  • 简单内部工具:BIO 足够。
  • 普通 Web 服务:使用 Servlet 容器或框架,不直接关心底层模型。
  • 高并发 TCP 服务:优先考虑 Netty。
  • 大文件异步处理:可评估 AsynchronousFileChannel。
  • 学习底层原理:BIO -> NIO -> AIO 顺序理解。

# 专家实践清单

维度 BIO NIO AIO
编程模型 阻塞同步 非阻塞多路复用 异步回调
线程成本 连接多时高 少量线程管理多连接 依赖系统和回调
复杂度 低 高 中高
Java 生态 普通业务常见 Netty 等广泛使用 使用相对少
排查难度 较低 较高 较高

模型演进:

BIO:线程等待 IO
  ▼
NIO:线程等待多个 IO 事件
  ▼
AIO:系统完成 IO 后通知程序

# Tips 快问快答

Q:BIO 是什么? A:阻塞 IO,线程发起 IO 后等待操作完成。

Q:NIO 的核心优势是什么? A:用多路复用减少高连接数下的线程数量。

Q:AIO 的核心思想是什么? A:发起异步操作后立即返回,完成后通过回调或 Future 通知。

Q:BIO 一定不能用于生产吗? A:不是,普通业务和连接数不高的场景 BIO 简单可靠。

Q:NIO 为什么复杂? A:需要处理事件循环、状态机、半包、半写和连接生命周期。

Q:AIO 为什么没有 NIO 常见? A:平台支持、生态成熟度和框架封装普及度都影响使用。

Q:高并发 TCP 服务通常怎么选? A:通常选择基于 NIO 的成熟框架,例如 Netty。

Q:选型最重要的不是模型名字,而是什么? A:业务规模、团队维护能力、性能指标和故障排查成本。

# 7. 总结

BIO 简单但线程成本高,NIO 复杂但适合高并发,AIO 提供异步回调模型但实际使用没有 NIO 广泛。工程选型时,不要为了“高级”而使用复杂模型,应优先考虑业务规模、团队经验、框架生态和可维护性。

上次更新: 2026/06/25, 14:19:18
零拷贝
字符集与乱码

← 零拷贝 字符集与乱码→

Copyright © 2023-2026 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式