【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章快快珍藏在Java后端开发面试中IO模型是高频考点。很多同学分不清同步/异步、阻塞/非阻塞更搞不懂BIO、NIO、AIO的区别。今天我们就用实战代码从底层原理到具体实现彻底讲清楚这些概念。## 一、核心概念同步 vs 异步阻塞 vs 非阻塞首先我们要理解两个维度的概念-同步/异步关注的是消息通知机制。同步是调用方主动等待结果异步是被调用方主动通知结果。-阻塞/非阻塞关注的是调用方在等待结果时的状态。阻塞是调用方被挂起等待非阻塞是调用方可以继续做其他事。### 1. 同步阻塞最典型BIO用户线程发起IO请求后内核进行数据准备线程一直阻塞等待直到数据就绪并拷贝到用户空间。### 2. 同步非阻塞NIO的基础用户线程发起IO请求后立即返回但需要不断轮询检查数据是否就绪。### 3. 异步阻塞少见用户线程发起IO请求后等待被通知结果但通知机制是异步的。### 4. 异步非阻塞AIO用户线程发起IO请求后立即返回当数据就绪时内核主动通知线程处理。## 二、BIO同步阻塞IOBlocking I/OBIO是最传统的IO模型每个连接对应一个线程。### 实战代码BIO服务器javaimport java.io.*;import java.net.*;public class BioServer { public static void main(String[] args) throws IOException { // 创建ServerSocket监听8080端口 ServerSocket serverSocket new ServerSocket(8080); System.out.println(BIO Server started on port 8080); while (true) { // ★ 阻塞点1accept()会阻塞直到有客户端连接 Socket clientSocket serverSocket.accept(); System.out.println(Client connected: clientSocket.getInetAddress()); // ★ 每个连接创建一个新线程处理 new Thread(() - { try { // 获取输入输出流 BufferedReader in new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter out new PrintWriter( clientSocket.getOutputStream(), true); String line; // ★ 阻塞点2readLine()会阻塞直到读取到数据 while ((line in.readLine()) ! null) { System.out.println(Received: line); out.println(Echo: line); // 回显数据 } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }}BIO的缺点- 每个连接需要独立线程连接数多时资源消耗巨大- 线程上下文切换开销大- 适用于连接数少且固定的场景## 三、NIO同步非阻塞IONon-blocking I/ONIO使用多路复用器Selector管理多个通道一个线程可以处理多个连接。### 实战代码NIO服务器javaimport java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;public class NioServer { public static void main(String[] args) throws IOException { // 1. 创建Selector多路复用器 Selector selector Selector.open(); // 2. 创建ServerSocketChannel并配置为非阻塞 ServerSocketChannel serverChannel ServerSocketChannel.open(); serverChannel.configureBlocking(false); // ★ 关键设置为非阻塞 serverChannel.bind(new InetSocketAddress(8080)); // 3. 将ServerSocketChannel注册到Selector关注ACCEPT事件 serverChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println(NIO Server started on port 8080); while (true) { // ★ 阻塞等待就绪的事件但这是高效的阻塞 int readyChannels selector.select(); if (readyChannels 0) continue; // 获取就绪的事件集合 SetSelectionKey selectedKeys selector.selectedKeys(); IteratorSelectionKey keyIterator selectedKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key keyIterator.next(); if (key.isAcceptable()) { // 处理新连接 ServerSocketChannel server (ServerSocketChannel) key.channel(); SocketChannel clientChannel server.accept(); clientChannel.configureBlocking(false); // 注册到Selector关注READ事件 clientChannel.register(selector, SelectionKey.OP_READ); System.out.println(New client connected); } else if (key.isReadable()) { // 处理可读事件 SocketChannel clientChannel (SocketChannel) key.channel(); ByteBuffer buffer ByteBuffer.allocate(1024); int bytesRead clientChannel.read(buffer); // ★ 非阻塞读 if (bytesRead 0) { buffer.flip(); byte[] data new byte[buffer.limit()]; buffer.get(data); String message new String(data); System.out.println(Received: message); // 回显数据 ByteBuffer writeBuffer ByteBuffer.wrap( (Echo: message).getBytes()); clientChannel.write(writeBuffer); // ★ 非阻塞写 } else if (bytesRead -1) { // 客户端关闭连接 key.cancel(); clientChannel.close(); } } // ★ 重要移除已处理的key防止重复处理 keyIterator.remove(); } } }}NIO的核心优势- 一个线程管理多个连接通过Selector- 非阻塞读写不会阻塞线程- 适用于连接数多、连接时间短的场景如聊天服务器## 四、AIO异步非阻塞IOAsynchronous I/OAIO是真正的异步IO发起IO操作后立即返回当操作完成时通过回调通知。### 实战代码AIO服务器Java 7javaimport java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;public class AioServer { public static void main(String[] args) throws IOException, InterruptedException { // 创建异步服务器通道 AsynchronousServerSocketChannel serverChannel AsynchronousServerSocketChannel.open(); serverChannel.bind(new InetSocketAddress(8080)); System.out.println(AIO Server started on port 8080); // ★ 异步接受连接注册CompletionHandler回调 serverChannel.accept(null, new CompletionHandlerAsynchronousSocketChannel, Void() { Override public void completed(AsynchronousSocketChannel clientChannel, Void attachment) { // 继续接受下一个连接递归调用 serverChannel.accept(null, this); // 处理客户端连接 ByteBuffer buffer ByteBuffer.allocate(1024); // ★ 异步读取数据注册CompletionHandler clientChannel.read(buffer, buffer, new CompletionHandlerInteger, ByteBuffer() { Override public void completed(Integer bytesRead, ByteBuffer attachment) { if (bytesRead 0) { attachment.flip(); byte[] data new byte[attachment.limit()]; attachment.get(data); String message new String(data); System.out.println(Received: message); // 异步写回数据 ByteBuffer writeBuffer ByteBuffer.wrap( (Echo: message).getBytes()); clientChannel.write(writeBuffer, null, new CompletionHandlerInteger, Void() { Override public void completed(Integer result, Void attachment) { System.out.println(Write completed); } Override public void failed(Throwable exc, Void attachment) { exc.printStackTrace(); } }); } } Override public void failed(Throwable exc, ByteBuffer attachment) { exc.printStackTrace(); } }); } Override public void failed(Throwable exc, Void attachment) { exc.printStackTrace(); } }); // 保持主线程运行 Thread.currentThread().join(); }}AIO的特点- 真正的异步IO无需轮询- 通过回调机制处理完成事件- 适用于连接数多、连接时间长的场景如文件服务器- 但实际应用中NIO更常用操作系统支持更好## 五、总结对比| 模型 | 同步/异步 | 阻塞/非阻塞 | 线程模型 | 适用场景 ||------|-----------|-------------|----------|----------|| BIO | 同步 | 阻塞 | 一个连接一个线程 | 连接数少、固定 || NIO | 同步 | 非阻塞 | 一个线程管理多连接 | 连接数多、短连接 || AIO | 异步 | 非阻塞 | 回调机制 | 连接数多、长连接 |面试重点1. BIO的accept()和read()是阻塞点NIO通过Selector实现多路复用2. NIO虽然是非阻塞但仍然是同步IO需要主动轮询/处理事件3. AIO才是真正的异步IO但实际项目中NIO更常用如Netty基于NIO4. 理解IO模型对设计高性能服务器至关重要实战建议- 简单应用用BIO如小型内网工具- 高并发网络应用首选NIO如Netty框架- 文件操作可以考虑AIO如大文件读写希望这篇文章能帮你彻底理解IO模型面试不再怕

相关新闻

STDF-Viewer:5大核心功能助力半导体测试数据可视化分析

STDF-Viewer:5大核心功能助力半导体测试数据可视化分析

STDF-Viewer:5大核心功能助力半导体测试数据可视化分析 【免费下载链接】STDF-Viewer A free GUI tool to visualize STDF (semiconductor Standard Test Data Format) data files. 项目地址: https://gitcode.com/gh_mirrors/st/STDF-Viewer 面对海量半导体…

2026/7/26 0:07:28阅读更多 →
卡梅德生物技术快报|抗体筛选:抗体筛选中的噬菌体展示四参数调优——从流程设计到数据验证

卡梅德生物技术快报|抗体筛选:抗体筛选中的噬菌体展示四参数调优——从流程设计到数据验证

一、问题提出:当前抗体筛选流程的瓶颈在哪里?在蛋白-抗体工具研发和诊断试剂开发中,抗体筛选是决定项目成败的关键节点。实际操作中,很多团队发现同样的噬菌体库、同样的靶蛋白,却得不到同样的结果——有人三轮输出高质…

2026/7/26 0:07:28阅读更多 →
卡梅德生物技术快报 | 纳米抗体和普通抗体区别:技术维度分析:分子结构、稳定性与工程化改造

卡梅德生物技术快报 | 纳米抗体和普通抗体区别:技术维度分析:分子结构、稳定性与工程化改造

引言在当前生物医药技术栈中,抗体类分子是最重要的靶向工具之一。然而,传统抗体的多结构域复杂性为计算建模、重组表达和工程化改造带来了巨大挑战。纳米抗体和普通抗体区别从技术视角看,涉及分子架构设计、蛋白稳定性优化、表达系统选择和计…

2026/7/26 0:07:28阅读更多 →
入藏中国国家图书馆的网文小说有哪些?首批 100 部 + 累计 144 部完整梳理

入藏中国国家图书馆的网文小说有哪些?首批 100 部 + 累计 144 部完整梳理

摘要:2020 年 8 月 31 日,国家图书馆与阅文集团达成战略合作,阅文挂牌成为国图第二家互联网信息战略保存基地,首批来自阅文平台的 100 部网文佳作被永久典藏,《诡秘之主》即在其中。到 2022 年,入藏国图的中…

2026/7/26 7:38:41阅读更多 →
Safari浏览器中如何只允许指定网站下载

Safari浏览器中如何只允许指定网站下载

Safari浏览器中如何只允许指定网站下载-百度经验Safari浏览器中如何只允许指定网站下载,Safari浏览器中如何允许指定网站下载https://jingyan.baidu.com/article/fcb5aff7a32e35acab4a7143.html

2026/7/26 7:38:41阅读更多 →
手把手教你搞懂大模型位置编码:RoPE、T5、ALiBi 从数学推导到代码实战全流程(保姆级·小白友好·附疑难解答)

手把手教你搞懂大模型位置编码:RoPE、T5、ALiBi 从数学推导到代码实战全流程(保姆级·小白友好·附疑难解答)

文章目录 从0到1掌握大模型位置编码:Rotary、T5、ALiBi 实战超详细教程 一、先搞懂“位置编码”为什么重要 1. 位置编码的核心作用 2. 常见位置编码类型 二、旋转位置编码(Rotary Embedding):大模型的“空间魔法” 1. Rotary的核心原理 2. 代码实战:实现Rotary位置编码 3.…

2026/7/26 7:38:41阅读更多 →
Kubernetes存储管理:PV、PVC与StorageClass实战解析

Kubernetes存储管理:PV、PVC与StorageClass实战解析

1. Kubernetes存储管理核心概念解析 在容器编排领域,持久化存储一直是生产环境部署的关键挑战。与传统虚拟机不同,容器本身具有临时性特征,当Pod发生调度迁移时,其内部数据会随之丢失。Kubernetes通过PV(PersistentVol…

2026/7/26 7:38:41阅读更多 →
【OpenClaw从入门到精通】第82篇:2026年7月大版本全解析——从38万星标到Control UI重构,安全与生产力如何兼得?

【OpenClaw从入门到精通】第82篇:2026年7月大版本全解析——从38万星标到Control UI重构,安全与生产力如何兼得?

摘要:本文围绕2026年7月OpenClaw v2026.7.1稳定版本展开全面解析,结合WAIC大会行业动态、Snyk安全报告与阿里云最新生态进展,覆盖版本核心更新、安全升级、实操部署三大维度。文章详细拆解Control UI重构、模型体系升级、端侧体验优化等核心特性,提供从旧版本平滑迁移的完整…

2026/7/26 7:38:41阅读更多 →
企业私有云盘怎么选?2026主流方案与坚果云同步盘对比

企业私有云盘怎么选?2026主流方案与坚果云同步盘对比

很多企业在选型时本能地倾向私有部署——“数据放在自己服务器上才安全”。但2026年的现实是:服务器采购、磁盘扩容、容灾机房、系统升级、安全加固、账号对接和日常运维累积起来,私有云盘的总成本往往远超预期。本文逐一对比坚果云公有云SaaS方案与赛凡…

2026/7/26 7:36:41阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/25 19:03:04阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/25 19:03:04阅读更多 →