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实现:ServerSocketSocket(传统网络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

相关推荐
6+h1 天前
【java IO】BIO、NIO、AIO 全面对比
java·python·nio
老虎06272 天前
Netty[ NIO 核心速成 ] ---- NIO三大组件(Channel & Buffer&selector)
java·github·nio
qq_232045574 天前
精积微半导体面试(部分)
netty·策略模式·nio·内存抖动·threadlocal·bitmap·复用
yaoxin5211234 天前
352. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 4
java·python·nio
yaoxin5211235 天前
350. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 2
java·python·nio
yaoxin5211235 天前
351. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 3
java·python·nio
23.8 天前
【Java】NIO 中的多路复用(Selector / Channel)机制
java·面试·nio
23.8 天前
【Java】NIO零拷贝:为何transferTo需要循环调用?
java·面试·nio
一叶飘零_sweeeet8 天前
从 BIO 到 AIO 全链路拆解:Reactor 模型演进与高并发 IO 架构落地实战
netty·nio