【java IO】BIO、NIO、AIO 全面对比

发布时间:2026/5/27 8:56:55

【java IO】BIO、NIO、AIO 全面对比 Java IO 从入门到深入第六篇BIO、NIO、AIO 全面对比高并发核心 面试重点在前几篇中我们已经学习了字节流 / 字符流缓冲流转换流对象流但这些都属于“如何读写数据”而本篇我们要解决的是“如何高效处理大量连接和请求”这就涉及三种 IO 模型BIOBlocking IO NIONon-Blocking IO AIOAsynchronous IO一、什么是 IO 模型IO 模型本质是程序如何与操作系统进行数据交互核心问题数据什么时候准备好 线程是否需要等待 如何处理多个连接二、BIO阻塞 IO1 什么是 BIOBIOBlocking IO阻塞 IO特点一个连接对应一个线程2 工作流程客户端连接 → 创建线程 → 阻塞等待数据 → 处理请求3 示例代码经典ServerSocketservernewServerSocket(8080);while(true){Socketsocketserver.accept();// 阻塞newThread(()-{try{InputStreamissocket.getInputStream();byte[]buffernewbyte[1024];intlenis.read(buffer);// 阻塞System.out.println(newString(buffer,0,len));}catch(Exceptione){e.printStackTrace();}}).start();}4 BIO 特点总结阻塞 一连接一线程 实现简单5 缺点重点线程开销大 无法支撑高并发 容易线程耗尽三、NIO非阻塞 IO1 什么是 NIONIONon-Blocking IO特点一个线程可以处理多个连接2 核心组件Channel通道 Buffer缓冲区 Selector选择器3 工作模型一个线程 ↓ Selector 监听多个连接 ↓ 事件触发读 / 写 ↓ 处理数据4 示例简化理解SelectorselectorSelector.open();ServerSocketChannelserverServerSocketChannel.open();server.configureBlocking(false);server.register(selector,SelectionKey.OP_ACCEPT);while(true){selector.select();SetSelectionKeykeysselector.selectedKeys();for(SelectionKeykey:keys){if(key.isAcceptable()){// 处理连接}if(key.isReadable()){// 处理读事件}}}5 NIO 核心特点非阻塞 多路复用 单线程处理多连接6 优点高并发 资源利用率高 减少线程数量7 缺点编程复杂 理解难度高四、AIO异步 IO1 什么是 AIOAIOAsynchronous IO异步 IO特点IO 完成后由系统通知程序2 工作流程发起请求 → 立即返回 → IO完成 → 回调通知3 示例简化AsynchronousServerSocketChannelserverAsynchronousServerSocketChannel.open();server.bind(newInetSocketAddress(8080));server.accept(null,newCompletionHandler(){Overridepublicvoidcompleted(AsynchronousSocketChannelchannel,Objectattachment){ByteBufferbufferByteBuffer.allocate(1024);channel.read(buffer,buffer,newCompletionHandler(){Overridepublicvoidcompleted(Integerresult,ByteBufferbuf){System.out.println(读取完成);}Overridepublicvoidfailed(Throwableexc,ByteBufferattachment){}});}Overridepublicvoidfailed(Throwableexc,Objectattachment){}});4 AIO 特点真正异步 基于回调 无需阻塞线程5 优缺点优点性能更高 无需轮询缺点实现复杂 使用较少 生态不成熟五、BIO / NIO / AIO 对比面试重点对比BIONIOAIO模型阻塞非阻塞异步线程一连接一线程少量线程更少并发能力低高更高编程难度简单较复杂很复杂使用场景小系统高并发超高并发六、三者本质区别面试必问核心问题线程是否等待 IO模型是否阻塞谁通知BIO是无NIO否轮询程序AIO否操作系统七、NIO 为什么更快重点原因多路复用Selector本质一个线程监听多个连接而不是一个线程一个连接八、实际应用场景BIO小型系统 简单服务NIONetty Tomcat Redis 主流方案AIO高端服务器 特殊场景实际使用较少九、Netty 与 NIO面试扩展很多面试会问Netty 是什么答案基于 NIO 的高性能网络框架优点封装复杂 NIO 提供高性能 易用十、常见易错点1 NIO 不是完全不阻塞select() 仍可能阻塞2 AIO 不等于 NIO一个是异步 一个是非阻塞3 NIO 编码复杂Buffer / Channel / Selector 容易混乱十一、面试高频问题重点1 BIO、NIO、AIO 区别标准答BIO阻塞 NIO非阻塞 多路复用 AIO异步回调2 NIO 核心组件Channel Buffer Selector3 什么是多路复用一个线程管理多个连接4 为什么 NIO 更适合高并发减少线程数量 减少上下文切换5 Netty 为什么快基于 NIO 线程模型优化 零拷贝十二、总结本篇是 Java IO 的最终总结篇。三种 IO 模型BIO简单但性能低 NIO主流高并发方案 AIO理论最强但用得少核心思想阻塞 → 非阻塞 → 异步实际建议学习重点NIO Netty

相关新闻