Java中BIO、NIO、AIO详解
参考:
https://blog.csdn.net/s2152637/article/details/98777686
https://blog.csdn.net/bigorsmallorlarge/article/details/137292669
1、几个基本概念
- Java中IO模型简介
在Java中,主要有三种IO模型,分别是:
- 同步阻塞IO(BIO)
- 同步非阻塞IO(NIO)
- 异步IO(AIO)
- 同步与异步
- 同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
- 异步:异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。
- 同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。
- 阻塞和非阻塞
- 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
- 非阻塞:非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。
注意:
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。
Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的
2、BIO(Blocking IO)
- 同步阻塞:BIO是同步阻塞的,意味着每当有一个IO操作发生时,线程都会被阻塞,直到操作完成。
- 面向流:BIO面向流进行数据读写,数据处理通常在单个线程中完成。
- 性能问题:对于大量的并发请求,BIO会因为每个请求都需要独立的线程而性能受限。
同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
Java中的BIO分为两种:
- 1、传统 BIO:一请求一应答
- 2、伪异步 IO:通过线程池固定线程的最大数量,防止资源的耗费。
在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
3、NIO(Non-blocking IO)
NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。
- 异步非阻塞:NIO是异步非阻塞的,允许一个线程处理多个IO操作,因此在高并发环境下性能更好。
- 面向缓冲区:NIO使用缓冲区进行数据操作,可以一次性读取或写入大量数据。
- 多线程支持:NIO可以通过多线程来提高性能,它可以很方便地实现多线程环境下的大量数据处理。
NIO的优势
- 线程模型:NIO使用多线程模型,可以显著提高IO密集型应用的性能。
- 非阻塞操作:允许线程在等待IO操作完成时进行其他任务,提高了资源利用率。
- 面向缓冲区:通过使用缓冲区,NIO可以减少系统调用次数,提高数据处理效率。
- 选择器:NIO中的选择器允许一个线程监控多个通道的IO事件,从而简化了多路复用。
NIO适用于以下场景
- 高并发服务器:如Web服务器、应用服务器等,需要处理大量并发请求。
- 大数据处理:如文件系统的读写操作,需要高效地处理大量数据。
- 网络编程:特别是在需要使用多路复用的场景,例如实现一个高效的TCP/UDP服务器。
总的来说,NIO提供了比BIO更高效的IO处理方式,特别是在处理大量并发请求和高并发场景下。通过使用缓冲区和选择器,NIO能够减少线程阻塞和系统调用次数,从而提高了性能和资源利用率。
在高并发应用中实现NIO通常涉及到使用Java的java.nio包中的类和接口。以下是一些关键的步骤和组件,它们帮助你在高并发应用中实现NIO:
-
缓冲区(Buffers):
使用缓冲区来减少系统调用和提高数据处理效率。例如,ByteBuffer、CharBuffer、DoubleBuffer等。 -
通道(Channels):
通道是NIO中用于IO操作的对象,它们提供了一个非阻塞的方式来读写数据。常用的通道有FileChannel、SocketChannel和ServerSocketChannel。 -
选择器(Selectors):
选择器用于监控多个通道的IO事件,如连接接入、数据读取等。一个线程可以使用一个选择器来处理多个通道。 -
多线程:
在高并发应用中,通常需要使用多个线程来处理不同的通道和任务。 -
事件驱动编程:
NIO采用事件驱动的方式来进行IO操作,这使得线程可以在等待IO操作完成时进行其他任务。
4、AIO (Asynchronous I/O)
AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
注意:
只有AIO是异步操作,BIO和NIO都是同步操作。
有人会提问,NIO不是在缓冲区存放数据吗?所以不应该是异步操作吗?
我们把读写数据分成两部分,第一部分为数据准备,即读写数据之前需要创建各种相关的对象,还要提供数据。第二部分为数据拷贝,即通过输入输出流读写数据或者通过通道想缓冲取读写数据。
NIO只是再第一部分数据准备阶段是异步操作,在数据拷贝阶段还是同步操作的。所以总的来说NIO还是同步操作,因此才叫同步非阻塞IO。
相关文章:
Java中BIO、NIO、AIO详解
参考: https://blog.csdn.net/s2152637/article/details/98777686 https://blog.csdn.net/bigorsmallorlarge/article/details/137292669 1、几个基本概念 Java中IO模型简介 在Java中,主要有三种IO模型,分别是: 同步阻塞IO&…...

cloud_enum:一款针对不同平台云环境安全的OSINT工具
关于cloud_enum cloud_enum是一款功能强大的云环境安全OSINT工具,该工具支持AWS、Azure和Google Cloud三种不同的云环境,旨在帮助广大研究人员枚举目标云环境中的公共资源,并尝试寻找其中潜在的安全威胁。 功能介绍 当前版本的cloud_enum支…...

图像的对比度和亮度
目标 访问像素值用0来初始化矩阵cv::saturate_cast像素转换提高一张图像的亮度 原理 图像处理 图像变换可以被视作两个步骤: 点操纵(像素转换)相邻区域转换(以面积为基础) 像素转换 在这种图像处理的转换过程中…...

手撕设计模式——计划生育之单例模式
1.业务需求 大家好,我是菠菜啊。80、90后还记得计划生育这个国策吗?估计同龄的小伙伴们,小时候常常被”只生一个好“”少生、优生“等宣传标语洗脑,如今国家已经放开并鼓励生育了。话说回来,现实生活中有计划生育&…...

Mac M3 Pro 部署Flink-1.16.3
目录 1、下载安装包 2、解压及配置 3、启动&测试 4、测试FlinkSQL读取hive数据 以上是mac硬件配置 1、下载安装包 官网:Downloads | Apache Flink 网盘: Flink 安装包 https://pan.baidu.com/s/1IN62_T5JUrnYUycYMwsQqQ?pwdgk4e Flink 已…...

Mysql 的分布式策略
1. 前言 MySQL 作为最最常用的数据库,了解 Mysql 的分布式策略对于掌握 MySQL 的高性能使用方法和更安全的储存方式有非常重要的作用。 它同时也是面试中最最常问的考点,我们这里就简单总结下 Mysq 的常用分布式策略。 2. 复制 复制主要有主主复制和…...

记录一个利用winhex进行图片隐写分离的
前提 是一次大比武里面的题目,属实给我开了眼,跟我之前掌握的关于隐写合并的操作都不一样。 它不是直接在文件里面进行输入文件隐写,叫你输入密码,或者更改颜色,或者偏移位置; 它不是单纯几个文件合并&a…...
压缩映射定理证明
收缩映射定理(又称Banach不动点定理)是一个重要的结果,特别是在分析和应用数学中。 定理(收缩映射定理):假设是一个从度量空间 (X,d) 到自身的函数,如果 是一个收缩映射,即存在常数 …...

Ubuntu20.04.6操作系统安装教程
一、VMware Workstation16安装 选择安装VMware Workstation,登录其官网下载安装包,链接如下: 下载 VMware Workstation Pro 下载后运行安装向导,一直Next即可。 二、Ubuntu镜像下载 ubuntu20.04 选择需要下载的镜像类型下载即…...
(分治算法3)leecode 53 最大子数组和(最大子段和)
题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 分治解法 这个问题可以分成从左半边数组找最大子段和从右半部分找最大子段和…...

【C++】模板初级
【C】模板初级 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板格式类模板的实例化 泛型编程 当我们之前了解过函数重载后可以知道,一个程序可以出现同名函数,但参数类型不同。 //整型 voi…...
eslint 使用单引号,Prettier使用双引号冲突
当 ESLint 规则要求使用单引号 (quotes: single) 而 Prettier 默认使用双引号时,会发生配置冲突。为了解决这个问题,你需要统一这两个工具的配置,确保它们遵循相同的规则。这里推荐两种解决方案: 解决方案 1: 修改 ESLint 配置以…...

进化生物学的数学原理 知识点总结
1、进化论与自然选择 1.1 进化论 1、进化论 过度繁殖 -> 生存竞争 -> 遗传和变异 -> 适者生存 2、用进废退学说与自然选择理论 用进废退:一步适应:变异 适应 自然选择:两步适应:变异 选择 适应 3、木村资生的中性…...

如何挑到高质量的静态IP代理?
在数字化时代,静态住宅IP代理已成为网络活动中不可或缺的一部分。无论是数据采集、网站访问,还是其他需要隐藏真实IP地址的在线活动,高质量的静态住宅IP代理都发挥着至关重要的作用。今天IPIDEA代理IP将详细介绍如何获取高质量的静态住宅IP代…...

vagrant putty错误的解决
使用Vagrant projects for Oracle products and other examples 新创建的虚机,例如vagrant-projects/OracleLinux/8。 用vagrant ssh可以登录: $ vagrant ssh > vagrant: Getting Proxy Configuration from Host...Welcome to Oracle Linux Server …...

图像分割——U-Net论文介绍+代码(PyTorch)
0、概要 原理大致介绍了一下,后续会不断精进改的更加详细,然后就是代码可以对自己的数据集进行一个训练,还会不断完善,相应其他代码可以私信我。 一、论文内容总结 摘要:人们普遍认为,深度网络成功需要数…...

C#进阶-ASP.NET的WebService跨域CORS问题解决方案
在现代的Web应用程序开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)问题是开发者经常遇到的一个挑战。特别是当前端和后端服务部署在不同的域名或端口时,CORS问题就会显得尤为突出。在这篇博客中,我们将深…...

如何利用TikTok矩阵源码实现自动定时发布和高效多账号管理
在如今社交媒体的盛行下,TikTok已成为全球范围内最受欢迎的短视频平台之一。对于那些希望提高效率的内容创作者而言,手动发布和管理多个TikTok账号可能会是一项繁琐且耗时的任务。幸运的是,通过利用TikTok矩阵源码,我们可以实现自…...
Java高级编程技术详解:从多线程到算法优化的全面指南
复杂度与优化 复杂度与优化在算法中的应用 算法复杂度是衡量算法效率的重要指标。了解和优化算法复杂度对提升程序性能非常关键。本文将介绍时间复杂度和空间复杂度的基本概念,并探讨一些优化技术。 时间复杂度和空间复杂度 时间复杂度表示算法执行所需时间随输…...
Redis 分布式锁过期了,还没处理完怎么办?
为了防止死锁,我们会给分布式锁加一个过期时间,但是万一这个时间到了,我们业务逻辑还没处理完,怎么办? 这是一个分布式应用里很常见到的需求,关于这个问题,有经验的程序员会怎么处理呢ÿ…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...