Java IO 之 BIO、NIO 和 AIO

news2024/11/18 19:26:59

一、IO

IO 是 Input 和 Output 二词的缩写,意为输入和输出,直接来说,实现一般的 I/O 是没有什么难度的,但涉及到多线程时,要解决 I/O 的问题就不是一个简单的事情了,会涉及到同步和异步的问题,阻塞和非阻塞的问题。

1.1 同步和异步

同步可以借用多线程来方便理解,多条线程,从字面意思上来看,当他们在同一直线上时,就是同步,反之则是异步。那什么是在同一直线上呢?简单说就是,它们都在处理同时事件,比如同时运行某个函数,调用或修改某个变量。

从这里我们不难看出,同步有时是会产生一些问题的,比如同时修改某个变量。从现实角度来看,这是不可能修改成功的,毕竟是完完全全同时嘛。但是,我们知道计算机的每个 CPU 执行多线程实际并非真的同时干两个事情,它只是将时间分片了,一会儿做这个线程的事情,一会做另外一个线程的事情,由于 CPU 切换任务和执行任务的速度非常非常快,因此从宏观时间尺度上来看,就好像多个线程在同时运行,但实际在微观时间尺度上,它们仍然是单线程的。

多线程

接上面的说,那么计算机的两个线程同时修改某个变量后,必然有一个线程先对这个变量进行修改,另外一个线程再对这个线程进行修改,由于分片数量和执行速度不能保证完完全全相同,所以我们无法预测到底是哪个线程先对这个变量进行的修改,那么这就会产生一系列无法预知的问题。为此,异步操作诞生了!

从程序优化的角度上看,异步操作优于同步操作,但相应地,实现难度会大一些。

1.2 阻塞和非阻塞

最典型的阻塞就是终端等待用户输入,Java 里面使用 Scanner 类时,在不做多线程等处理时,要一直等到用户在终端输入字符后,Scanner 类后面的代码才能运行。而非阻塞呢,在界面编程里面体现的非常明显,窗口的显示实际可以看作是一个大循环,它在每一次循环中都在刷新着窗口,但我们在窗口中的操作并运行一些计算的时候呢,界面也一直都在,它并不会因为我们操作了什么而产生了阻塞,导致窗口没有变化(不刷新)了。

从阻塞和非阻塞的含义上来看,大部分时间我们都希望程序是非阻塞的,因为阻塞的情况下,阻塞处后面的程序无法运行,这就浪费计算机的性能了,等阻塞完之后再执行后面的程序,会产生时间上的消耗,使用户产生延迟感,这是不好的,为了解决这个问题,非阻塞操作产生了!

从程序优化的角度上看,非阻塞操作优于阻塞操作,但相应地,非阻塞的实现难度大一些。

了解了(非)同步和(非)阻塞之后,我们再来看 I/O,根据是否同步和是否阻塞以及按它们出现的时间顺序,主要划分为 3 种 I/O 技术,分别是 BIO、NIO 和 AIO。当然,并不是只有这几种,还有其他的 I/O 类型。

二、BIO

BIO 是 Blocking I/O 的缩写,意为同步阻塞式 I/O,Blocking 是阻塞的意思。

BIO 是最基本的 I/O 处理模式。在这种模式下,当一个 I/O 操作正在进行时,会阻塞其他所有操作,直到这个 I/O 操作完成。这种模式的优点是编程模型简单,适合请求不高并发、任务简单的场景。但是,对于高并发的场景,BIO 可能会导致大量的线程阻塞,消耗大量的系统资源,性能较低。

三、NIO

NIO 是 Non-blocking I/O 的缩写,代表同步非阻塞式 I/O,Non-blocking 是非阻塞意思。

NIO 是对 BIO 的一种改进。在这种模式下,当一个 I/O 操作正在进行时,不会阻塞其他操作。NIO 通过使用 Buffer(缓冲区)和 Channel(通道)进行数据的传输,以及使用 Selector(选择器)进行多路复用,可以同时处理多个客户端的连接和请求。这种模式的优点是可以处理高并发的场景,但是编程模型相对复杂。

下面是 NIO 的主要组件:

Channel(通道):Channel 是一个可以进行 I/O 操作的连接点。所有的数据都必须通过 Channel 读取或者写入。Channel 的主要实现包括 FileChannel(用于文件 I/O)、DatagramChannel(用于 UDP I/O)和 SocketChannel(用于 TCP I/O)。

Buffer(缓冲区):Buffer 是一个容器,用于在 Channel 和程序之间传输数据。当我们从 Channel 读取数据时,数据会被读入 Buffer;当我们向 Channel 写入数据时,数据会从 Buffer 写入。

Selector(选择器):Selector 是一个可以监控多个 Channel 的 I/O 状态(如:连接、读取、写入)的组件。通过 Selector,我们可以使用一个线程来处理多个 Channel 的 I/O 操作。

虽然 NIO 可以处理高并发场景,但当并发数量过大时,由于 NIO 的原理,它仍然会出现类似 BIO 阻塞的情况。

四、AIO

AIO 是 Asynchronous I/O 的缩写,意为异步非阻塞式 I/O,Asynchronous 是异步的意思。按照我们之前说的,这已经属于是效果最好,实现最难的 I/O 了。

AIO 是一种更高级的 I/O 处理模式。在这种模式下,一个 I/O 操作可以在后台异步地进行,当操作完成时,会通知相应的线程进行处理。这种模式的优点是可以处理高并发的场景,并且编程模型相对简单。但是,由于 AIO 是在操作系统级别进行异步操作,所以对操作系统的要求较高。

五、总结

按照时间出现的顺序,分别是 BIO、NIO 和 AIO,按照技术实现难度,分别是 BIO、NIO 和 AIO。总结为下表:

I/OBIO(同步阻塞式)NIO(同步非阻塞式)AIO(异步非阻塞式)
是否同步
是否非阻塞
出现时间最早中等最迟
实现难度简单中等困难
实现效果中等
代码维护难度中等

这三者的应用场景如下:

  • BIO 适用于单线程或少量并发的场景,每个 I/O 操作都会阻塞当前线程;
  • NIO 适用于需要处理大量并发连接的场景,一个线程可以同时处理多个 I/O 操作;
  • AIO 适用于需要处理大量并发操作且不希望线程阻塞的场景,通过回调函数处理 I/O 操作的完成;

有人就要问了,怎么没有 异步阻塞式 I/O 呢?这是个好问题。

异步阻塞式 I/O 也不是没有,只不过它的叫法与其他的不太一样,它叫做 I/O 多路复用(I/O Multiplexing)。这里不详细展开讲述了,后面会单独出一片文章进行讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSL加速是什么,有什么优势?

SSL加速技术是一种专门用于加速HTTPS通信的技术,它可以在服务器和客户端之间提供高效的加密和解密处理,以提升网络通信的安全性和性能。以下是SSL加速技术的一些主要优势: 提高网站的访问速度:SSL加速技术可以对SSL握手过程进行优…

1143. 最长公共子序列(C++实现)

1143. 最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/ int longestCommonSubsequence(string text1, string text2) {int m text1.size(), n text2.size();vector<vector<int>> dp(m 1, vector<int>(n 1));for (int i 0; i …

C++文件操作示例

C 标准库提供了 3 个类用于实现文件操作&#xff0c;它们统称为文件流类&#xff0c;这 3 个类分别为&#xff1a; ifstream&#xff1a;专用于从文件读取数据 ofstream&#xff1a;专用于向文件写入数据 fstream&#xff1a;可读可写 这三个文件流类都位于 fstrea…

NSS [HNCTF 2022 WEEK2]easy_sql

NSS [HNCTF 2022 WEEK2]easy_sql 这题考察了无列名注入&#xff0c;首先了解一下什么是无列名注入再开始做题吧。 为什么会需要无列名注入&#xff1f; 我们常用的SQL注入方法是通过information_schema这个默认数据库来实现&#xff0c;可是你有没有想过&#xff0c;如果过滤…

下载github中单独某个子文件方法

在github中下载文件有很多方法&#xff0c;比如整体打包下载&#xff0c;单独小文件下载。我分享一个怎样下载某个单独文件夹方法。 在下载这个E文件夹时候&#xff0c;复制当前的url。 然后找到一个工具网页&#xff1a;DownGit 然后就可以下载文件夹的压缩文件了。

【机器学习】TF-IDF以及TfidfVectorizer

TF-IDF定义 TF-IDF&#xff1a; 全称为"词频一逆文档频率"。   TF&#xff1a;某一给定词语在该文档中出现的频率。 T F w 词语 w 在该文档中个数 该文档内总词个数 TF_w \frac{词语w在该文档中个数}{该文档内总词个数} TFw​该文档内总词个数词语w在该文档中个…

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关的SIP中继8、设置FXO网关呼叫…

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)

目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点&#xff1a; 缺点&#xff1a; 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…

Linux多线程【线程控制】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、线程知识补充1.2、线程私有资源1.3、线程共享资源1.4、原生线程库 2、线程…

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX 分机中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关中继线路呼入号码7、设置FXO网关呼叫路由&#xff08;呼入…

为啥我的第二个for循环不加框红的代码就运行失效呢?(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 苟全性命于乱世&#xff0c;不求闻达于诸侯。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子&#xff5e;】问了一…

【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示

2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数&#xff0c;其实就是非负数。在计算机中用字节码表示&#xff0c;目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化&#xff0c;0代表 &#xff0c;1代表 - &#xff0c;并把代表符号的数字放在有效数…

【Linux升级之路】6_进程间通信

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux升级之路】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量 &#x1f…

八股文学习一(存储)

一. 存储 行式存储的原理与特点 对于 OLAP 场景&#xff0c;大多都是对一整行记录进行增删改查操作的&#xff0c;那么行式存储采用以行的行式在磁盘上存储数据就是一个不错的选择。 当查询基于需求字段查询和返回结果时&#xff0c;由于这些字段都埋藏在各行数据中&#xf…

直播设备之ENC1高级篇拆机刷uboot教程

直播设备之ENC1高级篇拆机刷uboot教程 第一步&#xff1a; 准备材料第二步&#xff1a;拆外壳取出裸板第三步&#xff1a;链接串口线第四步&#xff1a;进入电脑&#xff0c;开始刷uboot第五步&#xff1a;开始刷设备固件 老铁们好&#xff0c;好久没出文章了&#xff0c;这两天…

【面试题】智力题

文章目录 腾讯1000瓶毒药里面只有1瓶是有毒的&#xff0c;问需要多少只老鼠才能在24小时后试出那瓶有毒。有两根不规则的绳子&#xff0c;两根绳子从头烧到尾均需要一个小时&#xff0c;现在有一个45分钟的比赛&#xff0c;裁判员忘记带计时器&#xff0c;你能否通过烧绳子的方…

leetcode21合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

Android之MediaMetricsService实现本质(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

AE-如何让一副静止的画变成动态图

如何让一副静止的画变成动态图,如图所示,如何让图中静态的芦苇随风摆动? 制作过程如下: 1.安装AutoSway AutoSway 可以从lookae 下载。 AutoSway 安装方法: 1)复制 AutoSway.jsxbin和AutoSway_ffx文件夹到AE脚本目录: Win:...Adobe After Effects CC\Support Fil…

【SDXL_LORA模型训练详细教程(含云端教程)】

个人网站&#xff1a;https://tianfeng.space 一、前言 之前写过一篇SD1.5 LORA模型的炼制方法&#xff0c;有的人想要我详细点说说秋叶启动器的lora训练器&#xff0c;SDXL建议使用秋叶的训练器&#xff0c;SD1.5赛博丹炉&#xff0c;个人习惯仅供参考&#xff01;这次基于s…