BIO、NIO、AIO

一、先搞懂核心前提:IO是什么?

IO = Input/Output ,就是程序和外部资源(文件、网络、数据库)数据交换 的过程。

核心痛点:IO速度远慢于CPU速度 ,所以不同IO模型,本质是等待方式不同。


二、三大IO模型超通俗讲解

1. BIO:Blocking IO ------ 同步阻塞IO

✅ 生活类比:餐厅单点服务员

你去餐厅吃饭,一个服务员只服务你一个人,你不点单,服务员就站在那干等;你不吃完,服务员不接下一个客人。

📊 图示
复制代码
客户端1 → 线程1 → 阻塞等待IO完成 → 处理
客户端2 → 线程2 → 阻塞等待IO完成 → 处理
客户端3 → 线程3 → 阻塞等待IO完成 → 处理

特点 :一个连接对应一个线程,连接等待时,线程全程阻塞,啥也不干。

🔧 核心原理
  • 同步:用户线程主动发起IO,自己等结果
  • 阻塞:IO没完成时,线程被挂起,CPU资源浪费
  • Java实现:ServerSocket、Socket(传统网络IO)
💡 优缺点
  • 优点:代码简单,逻辑清晰,适合新手
  • 缺点:并发能力极差,线程数=连接数,高并发下OOM
🎯 使用场景
  • 连接数极少、固定的小项目
  • 单机连接数 < 1000 的简单服务
  • 学习入门、测试Demo

2. NIO:Non-blocking IO ------ 同步非阻塞IO(Java NIO = New IO)

✅ 生活类比:餐厅叫号服务员

一个服务员同时盯多张桌子,不用一直等一个客人,轮流问:"你点好了吗?",没好就去问下一个,不用干等。

📊 图示
复制代码
客户端连接 → Channel(通道)→ Buffer(缓冲区)
                         ↓
                  Selector(选择器)→ 1个线程管理成千上万个连接

特点 :1个线程+Selector管理多个连接,连接不就绪时,线程去处理其他连接,不阻塞。

🔧 核心原理
  • 同步:还是用户线程自己去轮询检查IO状态
  • 非阻塞:IO未就绪时,线程立刻返回,不挂起
  • 三大核心:
    1. Channel(通道):双向传输数据,像高速公路
    2. Buffer(缓冲区):数据中转站,读写都走Buffer
    3. Selector(选择器):管家,监听多个通道的就绪事件
💡 优缺点
  • 优点:高并发,少量线程管理大量连接,资源占用低
  • 缺点:编程复杂,需处理轮询、缓冲区、粘包拆包
🎯 使用场景
  • 高并发、长连接场景(最常用)
  • 聊天服务器、游戏服务器、物联网网关
  • Java中间件:Netty、Mina、Redis客户端、Dubbo底层

3. AIO:Asynchronous IO ------ 异步非阻塞IO

✅ 生活类比:外卖配送

你点外卖,不用等,不用催,外卖做好了,骑手直接给你送上门,你该干嘛干嘛。

📊 图示
复制代码
客户端发起IO请求 → 操作系统内核处理
       ↓(完全不用管)
用户线程做其他事
       ↓(IO完成后)
操作系统主动通知用户线程 → 处理数据

特点 :完全异步,用户线程发起请求后直接返回,IO完成由系统主动回调。

🔧 核心原理
  • 异步:用户线程不参与IO过程,由内核完成后回调
  • 非阻塞:全程不阻塞用户线程
  • Java实现:AsynchronousServerSocketChannel,基于操作系统异步API
💡 优缺点
  • 优点:性能极致,线程利用率最高,编程逻辑更简洁(回调/Future)
  • 缺点:操作系统支持不完善(Windows好,Linux一般),调试复杂
🎯 使用场景
  • 连接数多且操作耗时的场景
  • 大数据文件传输、高性能存储服务
  • 目前生产用得少,Linux下AIO成熟度不如NIO

三、三大IO核心对比表(一目了然)

对比维度 BIO NIO AIO
全称 同步阻塞IO 同步非阻塞IO 异步非阻塞IO
线程模型 1连接1线程 1线程管理多连接 依赖系统异步回调,极少线程
阻塞性 阻塞 非阻塞(轮询) 非阻塞(回调)
编程难度 简单 复杂 较复杂
并发能力 低 高 极高
Java版本 JDK1.0 JDK1.4 JDK1.7
主流框架 传统Socket Netty、Mina 极少商用

四、终极选择建议(工作直接用)

  1. 新手学习/小项目 :选 BIO,快速上手
  2. 生产高并发服务 :选 NIO + Netty(Java后端标配,99%场景用这个)
  3. 特殊高性能场景+系统适配 :再考虑 AIO

相关推荐
那个松鼠很眼熟w4 天前
【NIO】4. ByteBuffer的几个重要方法
nio
那个松鼠很眼熟w4 天前
【NIO】3.1 ByteBuffer的原理
nio
那个松鼠很眼熟w4 天前
【NIO】3.2 ByteBuffer的原理-AI参考
nio
那个松鼠很眼熟w4 天前
【NIO】5. FileChannel的基本用法
nio
那个松鼠很眼熟w4 天前
【NIO】2. ByteBuffer的基本使用
nio
今天的砖头有点烫手啊9 天前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java·jvm·nio
名字还没想好☜1 个月前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
滕州市燕猫虎计算机科技工作室个体工商户1 个月前
java.nio.ByteBuffer的几个常用方法
nio
C++ 老炮儿的技术栈1 个月前
西门子 S7 常用存储区(I/Q/M/T/C/DB/PI/PQ)
linux·开发语言·c++·windows·qt·io
CodeStats1 个月前
【Java文件IO】Java 文件 IO 体系深度拆解(中):NIO API 详解、Files 与 FileChannel 巅峰对决
java·io·文件·nio·零拷贝·mmap