IO Vs NIO

一、IO(传统阻塞式)

全称‌:Input/Output(输入/输出)

定义‌:Java 1.0 引入的基础 I/O 模型,基于流(Stream)的同步阻塞操作,线程在读写数据时会阻塞直到操作完成。

二、NIO(新式非阻塞式)

‌全称‌:

官方名称:New I/O(Java 1.4 引入的新 I/O 库)

技术特性名称:Non-blocking I/O(非阻塞 I/O)

‌定义‌:基于通道(Channel)和缓冲区(Buffer)的同步非阻塞模型,支持多路复用(Selector)和零拷贝等高并发优化。

当采用阻塞式的模式时,需要通过accept、read、write这些阻塞式函数进行连接的创建,数据的读取和写出,函数返回必须等待这个动作的完成。

当调用accept时,必须有新的连接进来时,函数才会返回,并产生新的连接对象。

当调用read时,必须得有数据存在时或者连接断开时,函数才会返回,返回值代表读取到的数据量或者小于0代表连接断开。

当调用write时,必须等待所发送的数据完全发送完毕或连接断开时,函数才会返回。

基于阻塞的因素,导致软件无法把多个连接的操作放置在一个线程内,因为如果这样操作,一旦一个连接发生了阻塞,那么其它连接就无法顺利操作下去。所以在这种模式下,通常需要为每个连接配置独立线程,读线程是必须的,写线程依赖业务逻辑,或许可以混合在读线程中(如果写总是发生在读信息之后)。

阻塞式模式,意味着10000个连接,至少必须开启10000个线程为匹配业务,这个对系统的资源开销太大了。

而非阻塞式IO则是为了解决上述问题,以达到高并发的目的。其实最终还是要完成连接的创建、数据的读写,设计思想在于是否能够在做这些操作之前,提前知道是否有数据可读或是否有空间可写呢?

是的,操作系统都提供了一些内核到用户态的通知消息,以通知新的连接创建到达、某个连接当下有多少数据可读,某个连接当下有多少缓存区可写入数据进行发送。

基于上述的这些通知机制,内部管理注册的多个(10000个)连接,接收对应的通知消息,则可以知道每个连接的状态,当外部轮训调用select函数时,返回可读或可写的连接,在这个基础上,外部再进行read或者write。read返回当前可读到的数据,write写入缓存可写入,不再一次性强制写完,函数返回真真写入的数据量。

简单来说,在系统的accept、read和write基础上,添加了一个逻辑层,这一层内通过系统的通知消息,获知每个连接的状态信息,从而在通过这一层对应函数调用时,进行连接的状态判别,避免调用进入系统级别的阻塞式流程。

Java采用java.nio.channels.Selector类达成NIO的异步逻辑层。

相关推荐
tobebetter952711 小时前
How to manage python versions on windows
开发语言·windows·python
Y***h18712 小时前
第二章 Spring中的Bean
java·后端·spring
9***P33412 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
8***293112 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
CoderYanger12 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz12 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
q***062912 小时前
Tomcat的升级
java·tomcat
多多*12 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
青云交12 小时前
Java 大视界 -- Java 大数据在智能物流无人配送车路径规划与协同调度中的应用
java·spark·路径规划·大数据分析·智能物流·无人配送车·协同调度
d***817213 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端