Skip to content

AIO

一、异步 IO 概述

  • 与同步 IO 的区别
    • 同步 IO(阻塞式、非阻塞式、多路复用):应用程序主动询问操作系统事件状态,操作系统不主动通知(“不问不答”)。
    • 异步 IO:采用“订阅-通知”模式,应用程序注册监听后继续执行,操作系统在事件发生并准备好数据后主动通知。
  • 操作系统支持
    • Windows:提供真正的异步 IO 技术 IOCP(I/O 完成端口)。
    • Linux:无原生异步 IO,使用 epoll(多路复用 IO)模拟异步行为。

二、Java 对 AIO 的支持

  • 框架特点
    • Windows:基于 IOCP 实现(如 WindowsAsynchronousSocketChannelImpl)。
    • Linux:基于 epoll 模拟异步 IO。
  • 核心类
    • 从 java.nio.channels.spi.AsynchronousChannelProvider 开始,适配不同操作系统。
    • 通道类型
      • AsynchronousServerSocketChannel:服务器监听通道。
      • AsynchronousSocketChannel:客户端套接字通道。
  • 与 NIO 的关系
    • 共享 NetworkChannel 接口,但 AIO 无需 Selector,直接通过通道订阅事件。

三、为何选择 Netty

  • Java NIO/AIO 局限
    • 无上层格式封装(如 JSON、Protocol Buffer)。
    • 缺少权限管理、数据读取等高级功能。
    • Linux 下 poll/epoll bug(Selector.select 不阻塞,CPU 100%)。
  • Netty 优势
    • 封装数据格式(责任链模式编解码)。
    • 提供权限、易维护性、高性能支持。
    • 处理 NIO bug(JDK 1.7 未完全修复)。
    • Netty 底层仍基于 NIO/AIO,但更易用。

四、总结

  • 异步 IO:订阅-通知模式,效率高于同步 IO。
  • Java AIO
    • Windows 用 IOCP,Linux 用 epoll 模拟。
    • 无 Selector,通道直接订阅事件。
  • 应用场景:高并发网络通信,需搭配线程池优化。
  • Netty 推荐:弥补 AIO 不足,提供完整解决方案。