JAVA中三种I/O框架——BIO、NIO、AIO

一、BIO(Blocking I/O)

BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间;

在一般的场景中,多线程模型下的BIO是成本较低、收益较高的方式。但是,如果在高并发的场景下,过多的创建线程,会严重占据系统资源,降低系统对外界响应效率。即使使用线程池,只能一定程度上缓解了频繁调用IO接口带来的资源占用。

二、NIO(Non-Blocking/New I/O)

NIO,JAVA中与JDK1.4引入该IO模型,但不要简单的理解为同步非阻塞,JAVA中的NIO实际上可以看作IO多路复用模型,下面简单介绍下这两种I/O模型。

2.1 同步非阻塞模型

应用程序向内核发起请求后,即使kernel没有从磁盘中取到数据,也会返回一个结果给用户,用户判断结果正确性,如果不是需要的数据,则后续继续发起请求,即轮询请求,直至kernel取到数据并返回。

采用轮询方式,会导致系统上下文切换开销很大,会大幅度推高CPU占用率。

2.2 IO多路复用模型

Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗,解决了同步阻塞I/O和同步非阻塞I/O的问题,是一种非常高效的I/O模型。

三、AIO(Asynchronous I/O)

AIO,异步IO模型,也叫NIO2,JAVA7中引入,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

四、几种常见IO模型的对比

图片来自【美团技术团队】https://tech.meituan.com/2016/11/04/nio.html ,其中也详细阐述了NIO模型,可前往学习。

相关推荐
字节源流4 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9875 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)5 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞5 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
在未来等你6 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈6 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥6 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧
揽你·入怀6 小时前
数据结构:ArrayList简单实现与常见操作实例详解
java·开发语言
okok__TXF7 小时前
SpringBoot3+AI
java·人工智能·spring
AA-代码批发V哥7 小时前
Math工具类全面指南
java·开发语言·数学建模