hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶

BIO NIO AIO的区别?

在 Java 网络编程中,BIONIOAIO 是三种不同的 I/O 模型,它们的核心区别在于 阻塞与非阻塞同步与异步 的实现方式以及对系统资源的利用效率。


1. BIO(Blocking I/O,阻塞式 I/O)

核心特点

  • 同步阻塞模型:线程在读写数据时会被阻塞,直到操作完成。
  • 一连接一线程:每个客户端连接需要独立的线程处理,线程资源消耗大。
  • 简单直观:代码实现简单,适合低并发场景。

工作流程

  1. 服务端监听端口,等待客户端连接(ServerSocket.accept() 会阻塞线程)。
  2. 客户端连接后,服务端为每个连接创建一个新线程处理读写(Socket.getInputStream().read() 也会阻塞线程)。
  3. 线程在读写数据时无法处理其他任务,资源利用率低。

适用场景

  • 客户端连接数较少(如传统单机应用)。
  • 开发简单,适合快速验证逻辑。

缺点

  • 高并发时线程数暴增,导致线程切换开销大,甚至内存溢出。
  • 资源浪费严重,线程大部分时间在等待 I/O 操作。

2. NIO(Non-blocking I/O,同步非阻塞 I/O)

核心特点

  • 同步非阻塞模型:线程通过轮询检查 I/O 操作是否就绪,不会一直阻塞。
  • 多路复用(Selector):单线程可管理多个连接通道(Channel),通过事件驱动处理 I/O。
  • 面向缓冲区(Buffer):数据通过 Buffer 读写,减少直接操作流的开销。

工作流程

  1. 服务端通过 Selector 监听多个 Channel 的事件(如连接、读、写)。
  2. 当某个 Channel 有事件就绪时,Selector 通知线程处理,线程不会阻塞。
  3. 通过 Buffer 批量读写数据,提高效率。

适用场景

  • 高并发场景(如即时通信、游戏服务器)。
  • 需要高效管理大量长连接的应用。

优点

  • 减少线程数量,通过事件驱动提高资源利用率。
  • 支持单线程处理多个连接,避免线程切换开销。

缺点

  • 编程复杂度高(需处理 SelectorBufferChannel 的关系)。
  • 需要处理粘包/拆包问题,逻辑复杂。

3. AIO(Asynchronous I/O,异步非阻塞 I/O)

核心特点

  • 异步非阻塞模型:I/O 操作由操作系统完成后,通过回调机制通知应用。
  • Proactor 模式:应用发起 I/O 请求后立即返回,由操作系统完成实际读写并通知结果。
  • 零阻塞:应用线程无需等待 I/O 操作。

工作流程

  1. 应用发起异步 I/O 操作(如 AsynchronousServerSocketChannel.accept())。
  2. 操作系统完成 I/O 操作(如数据读取)后,通过回调函数(CompletionHandler)通知应用。
  3. 应用线程继续处理其他任务,无需等待。

适用场景

  • 高吞吐量、长延迟的 I/O 密集型应用(如文件传输)。
  • 需要完全异步处理 I/O 的场景。

优点

  • 彻底避免线程阻塞,资源利用率最高。
  • 简化高并发编程模型。

缺点

  • 实现复杂,调试困难(回调地狱问题)。
  • 依赖操作系统支持(如 Linux 对 AIO 的支持不完善)。
  • 实际应用中较少使用(NIO 更成熟)。

三者的核心对比

特性BIONIOAIO
阻塞/非阻塞阻塞非阻塞非阻塞
同步/异步同步同步异步
线程模型一连接一线程单线程处理多连接(多路复用)操作系统完成 I/O,回调通知
编程复杂度简单复杂非常复杂
资源消耗高(线程多)低(线程少)极低
适用场景低并发、短连接高并发、长连接高吞吐、异步处理

选择建议

  1. BIO:适合简单应用或学习 I/O 模型的基础原理。
  2. NIO:高并发场景的默认选择(如 Netty 框架基于 NIO)。
  3. AIO:在特定场景下(如文件操作)可能更高效,但需注意操作系统兼容性。

demo

BIO 的简单实现
// 服务端代码
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {Socket socket = serverSocket.accept(); // 阻塞new Thread(() -> {// 处理读写(read() 会阻塞)}).start();
}
NIO 的核心组件
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select(); // 非阻塞,返回就绪的 ChannelSet<SelectionKey> keys = selector.selectedKeys();// 处理连接、读、写事件...
}
AIO 的回调机制
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(8080));
server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel client, Void attachment) {// 处理客户端连接ByteBuffer buffer = ByteBuffer.allocate(1024);client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer buffer) {// 处理读取的数据}});}
});

总的来说

  • BIO 的阻塞模型简单但性能差,适合低并发场景。
  • NIO 通过多路复用和事件驱动实现高并发,是主流选择。
  • AIO 理论上性能最优,但受限于实现复杂性和操作系统支持,实际使用较少。

IDEA ji huo
https://pan.quark.cn/s/4216736c0427
最新🎬大全(唐探)
https://kdocs.cn/l/cqhxNU9I2lLD

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/68171.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/68171.shtml
英文地址,请注明出处:http://en.pswp.cn/web/68171.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心

所谓刷题&#xff0c;最重要的就是细心 &#x1f4cc; 题目描述 在 X 进制 中&#xff0c;每一数位的进制不固定。例如&#xff1a; 最低位 采用 2 进制&#xff0c;第二位 采用 10 进制&#xff0c;第三位 采用 8 进制&#xff0c; 则 X 进制数 321 的十进制值为&#xff…

BUU24 [GXYCTF2019]BabyUpload 1

开局上传文件 上传muma.php 上传.htaccess文件也被打回 再次求助互联网&#xff0c;才发现这提示给的多么明显&#xff0c;上传.htaccess文件是检查文件类型&#xff08;Contnet-Type&#xff09;&#xff0c;上传muma.php是检查后缀里头有没有ph &#xff0c;检查文件类型那…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)

文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8&#xff08;例如en…

3.攻防世界 weak_auth

题目描述提示 是一个登录界面&#xff0c;需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码&#xff1a;123456 直接得到flag 常用弱口令密码&#xff08;可复制&#xff09; 用户名 admin admin-- admin or -- admin…

优化深度神经网络

训练集、开发集(验证集)、测试集 偏差与方差 正则化 L2正则 Dropout 随机丢弃部分神经元输入&#xff0c;经常用于计算机视觉的神经网络内&#xff0c;因为通常没有足够的训练数据&#xff0c;很容易出现过拟合的问题 数据增强 训练集规一化 可以使其图像更均匀&#xff0c;…

【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试

《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权&#xff08;Broken object-level authorization&#xff09;1.5 破防的属性级授权&a…

Spring @PropertySource:让你的应用配置更加模块化和可维护

PropertySource注解在Spring中的作用&#xff0c;就像是给Spring应用配了一个“外部配置箱”。 想象一下&#xff0c;你在开发一个Spring应用时&#xff0c;有很多配置信息需要设置&#xff0c;比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…

RK3576——USB3.2 OTG无法识别到USB设备

问题&#xff1a;使用硬盘接入到OTG接口无热插拔信息&#xff0c;接入DP显示屏无法正常识别到显示设备&#xff0c;但是能通过RKDdevTool工具烧录系统。 问题分析&#xff1a;由于热插拔功能实现是靠HUSB311芯片完成的&#xff0c;因此需要先确保HUSB311芯片驱动正常工作。 1. …

docker-compose 配置nginx

前言 前端打包的dist文件在宿主机&#xff0c;nginx运行在docker-compose 问题 nginx.conf 在本地配置可以生效&#xff0c;但是链接到容器就报错 基于本地的nginx运行&#xff0c;本地nginx.conf 如下 server {listen 8081;location / {root /usr/local/software/testweb/…

基于SpringBoot+ Vue的家教管理系统

随着互联网技术的发展&#xff0c;信息化管理已经深入到各个行业中。在教育领域&#xff0c;家教管理系统的需求日益增长。传统的手工管理方式在面对大量信息时&#xff0c;容易出现管理效率低下、数据错误率高、修改困难等问题。本文将介绍基于Spring Boot框架、MySQL数据库开…

【数据结构】树哈希

目录 一、树的同构1. 定义2. 具体理解(1) 结点对应(2) 孩子相同(3) 递归性质 3. 示例 二、树哈希1.定义2.哈希过程&#xff08;1&#xff09;叶节点哈希&#xff08;2&#xff09;非叶节点哈希&#xff08;3&#xff09;组合哈希值 3.性质&#xff08;1&#xff09; 唯一性 \re…

使用DeepSeek的技巧笔记

来源&#xff1a;新年逼自己一把&#xff0c;学会使用DeepSeek R1_哔哩哔哩_bilibili 前言 对于DeepSeek而言&#xff0c;我们不再需要那么多的提示词技巧&#xff0c;但还是要有两个注意点&#xff1a;你需要理解大语言模型的工作原理与局限,这能帮助你更好的知道AI可完成任务…

【工具篇】ChatGPT:开启人工智能新纪元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒体界,还是咱们普通人的日常聊天里,都能听到它的大名。好多人都在讨论,这 ChatGPT 到底是个啥 “神器”,能让大家这么着迷?今天咱就好好唠唠。 ChatGPT,全称是 Chat Generative Pre-trained Trans…

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)

1. 安装必要的依赖 以 CentOS 7 系统为例&#xff0c;安装必要的依赖包&#xff1a; sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…

$route 和 $router 的区别是什么?

在 Vue Router 中,$route 和 $router 是两个不同的对象,它们各自承担着不同的角色。下面是它们的主要区别: 一、$route 定义$route 是当前路由的信息对象,包含了与当前路由相关的状态和参数。它是一个只读对象。 2. 主要属性 params:动态路由参数,例如 /user/:id 中的 …

node.js 08 express的使用和热重载nodemon的安装

一.express的安装和使用 安装 npm i express 使用 //引入express const express require(express)//启动服务器 const app express()//设置get请求地址&#xff0c;获取请求地址信息&#xff0c;和发送返回的数据 app.get(/bailan,(req, res) > {//req.query可以获取到客…

Python因为网络原因安装依赖库报错

现象 在终端运行以下指令 pip install pyautogui pillow keyboard 出现报错&#xff0c;终端信息如下&#xff1a; PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…

面试问题记录1

问题一&#xff1a;性能测试步骤 性能测试步骤主要包括以下几个阶段&#xff1a; ‌1. 需求分析阶段‌ 明确测试目标&#xff0c;了解性能测试需求&#xff0c;包括业务列表、性能指标、测试环境、数据量等详细需求‌12。熟悉项目相关的资源&#xff0c;如架构设计、软硬件环…

开源 GPU 集群管理器 GPUStack 轻松拉起deepseek各版本模型

GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。 项目地址&#xff1a;gpustack/gpustack: Manage GPU clusters for running AI modelshttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://githu…

ESP32开发学习记录---》GPIO

she 2025年2月5日&#xff0c;新年后决定开始充电提升自己&#xff0c;故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了&#xff0c;我就不再赘述&#xff0c;我这里只是对我的学习经历的一些记录。 首先学习一个…