惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
WordPress大学
WordPress大学
Jina AI
Jina AI
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
N
Netflix TechBlog - Medium
腾讯CDC
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
月光博客
月光博客
博客园 - Franky
Y
Y Combinator Blog
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
雷峰网
雷峰网
小众软件
小众软件
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
Java BIO,NIO最真实简单的理解
aoeiuv · 2026-04-20 · via 博客园_首页

BIO就是阻塞的,NIO就是非阻塞?BIO就是堆内存,NIO就是直接内存?用了NIO就高并发,难道是银弹?

NONONO
当然不是!
我们不讲具体技术及名词,存讲概念,把什么是B/NIO理解清楚了,网上的文章太多概念模糊,太千篇一律(也许是我个人一直没怎么深入IO相关开发,最近搞netty,才逐渐将概念清晰,深刻)。

第一,BIO和NIO不是一整套开发技术或者流程,它只是两种IO交互概念

这么说是不是也很笼统,不急,现在就给定义:

  • BIO:面向流 Stream(单向读写)
  • NIO:面向通道 Channel + 缓冲区 Buffer

嘿,这不是和网上一样吗?没错,再给:
BIO,你就理解,操作系统给你一块内存缓冲,你每次都去查看有没有新数据,有你就搬运,没有你就阻塞等待一会再去查看。
NIO,channel你就理解为句柄和触发器,缓冲区buffer,你就理解为和BIO一样的内存缓冲,它和BIO区别就在于,你不需要主动去查看缓冲,而是触发器触发有数据可以读取了,这就是事件驱动。至于,你的线程要不要等待,还是去做其他事,这就看你想要的了。 回答了开头,NIO既可以是阻塞的,也可以是非阻塞。

第二,内存缓冲 只是块内存,在Java中它没有BIO和NIO之分,只有堆内存还是直接内存的区别。

好理解吧,BIO读取的数据也可以写入直接内存(通过NIO的api),NIO堆内存和直接内存都可以写入,就看你选哪块。

额外强调:现代 JDK(JDK8+)的 DirectByteBuffer 早就做了 JNI 内联优化,老教程吹的「直接内存 JNI 调用慢、频繁用户态内核切换」已经过时了。HotSpot JIT 把直接内存的读写操作内联消除了 JNI 桩,日常读写直接内存几乎没有额外开销,不会频繁切内核。

最后一个问题 NIO就一定快?

不一定哦,看场景,底层基础设施是阻塞的,用了NIO除了IO方式变化了,性能不一定能提升多大,比如数据库,它慢,上层再快有什么用。
而且还有个误区,NIO只是并发能力高了,你底层耗cpu,耗内存等情况,并发能力再高,实际能处理的能力不高,也没用。