第一章Netty,Selector key cancel的机制

发布时间:2026/10/4 12:27:22

第一章Netty,Selector key cancel的机制 在 Java NIO 中,SelectionKey.cancel() 是管理通道生命周期和 Selector 状态的核心机制。它并非立即从内存中物理删除键,而是通过一种‌延迟清理(Lazy Cleanup)‌的策略来保证多线程环境下的安全性和性能。以下是 cancel 机制的详细解析:一、核心流程:从“标记”到“清理”调用 key.cancel() 后,内部执行分为两个阶段:1. 标记阶段(立即执行)状态变更‌:将 SelectionKey 的内部状态标记为无效(valid 设为 false)。加入取消队列‌该键被添加到 Selector 内部的 ‌cancelled-keys 集合‌中。解除关联‌:该键不再关联任何感兴趣的事件集(interest ops 设为 0)。注意‌:此时,该键可能仍然存在于 Selector 的 keys 集合(所有注册键)和 selected-keys 集合(当前就绪键)中。2. 清理阶段(延迟执行)触发时机‌:下一次调用 selector.select()、selector.selectNow() 或 selector.wakeup() 时。执行动作‌:Selector 会遍历 cancelled-keys 集合,执行以下操作:从 Selector 的底层多路复用器(如 Linux 的 epoll 或 Windows 的 IOCP)中注销该通道。从 Selector 的 keys 集合中移除该键。从 selected-keys 集合中移除该键(如果存在)。清空 cancelled-keys 集合。二、为什么采用延迟清理?线程安全‌:select() 方法可能在后台线程运行,而 cancel() 可能由业务线程调用。如果立即从底层数据结构中移除,可能导致并发修改异常(ConcurrentModificationException)或竞态条件。通过引入中间队列(cancelled-keys),实现了生产者-消费者模型的解耦。性能优化‌:频繁地修改底层操作系统内核的事件注册表(如 epoll_ctl)开销较大。批量处理取消操作可以减少系统调用的次数。三、常见误区与最佳实践1. cancel() 不会关闭通道机制‌:cancel() 仅停止 Selector 对该通道事件的监控。后果‌:底层的 Socket 或文件描述符仍然打开,资源未释放。正确做法‌:必须显式调用 channel.close()。通常建议先 cancel() 再 close(),或者直接在 close() 内部会自动触发 cancel 逻辑(但显式调用更清晰)。// 标准清理流程key.cancel();// 1. 取消注册,停止监控key.channel
延伸阅读

更多相关文章

2026/10/5 0:18:02

Platinum-MD:让经典MiniDisc设备重获新生的完整指南

Platinum-MD:让经典MiniDisc设备重获新生的完整指南 【免费下载链接】platinum-md Minidisc NetMD Conversion and Upload 项目地址: https://gitcode.com/gh_mirrors/pl/platinum-md 还在为那些尘封的索尼MiniDisc播放器找不到合适的音乐管理软件而烦恼吗&a…

2026/10/5 3:22:17

Netty高性能架构全解析:从IO模型到工程实战

前几周有个读者在群里问:一台 4C8G 的机器,想撑住 5 万个长连接设备,Java 到底行不行?底下有人说“换 Go 吧”,也有人直接贴了一段 Netty 的初始化代码。我的回复是:先别急着换语言,Netty 在 Ja…

2026/10/5 3:22:17

Netty高性能网络编程实战:从Reactor模型到零拷贝与粘包处理

1. 开篇:Netty到底是什么,凭什么它能扛住千万级连接做Java后端的人,几乎早晚都会撞上Netty。如果你还没接触过,可以先这么理解:Netty是一个封装了Java NIO的高性能网络通信框架,专门用来搞定高并发的TCP/UD…

2026/10/5 3:22:17

DMDRS迁移组合分区表子分区机制解析与踩坑实践

前阵子做一套业务系统的异构迁移,源端有一张跑了三年多的订单流水表,按月份做了范围分区,每个月份分区下面又按城市做了列表子分区,整体是“范围-列表”的组合分区结构。表不大,大概1.2TB,但分区数量非常可…

2026/10/5 3:22:17

mysql exe 一文讲透:安装、打包与问题排查

先来一个灵魂拷问:你在搜索引擎里敲下“mysql exe”这五个字符时,脑子里想的到底是哪件事?是想下载MySQL的Windows安装包、想把写好的Python脚本打包成exe,还是安装完MySQL之后发现bin目录里的mysql.exe连不上服务器?我…

2026/10/5 3:22:17

杭州展台设计行业迎数智化转型,乐牛奶以创意实力破局

在数字经济蓬勃发展的当下,展览展示行业正迎来前所未有的发展机遇。无论是城市规划馆、企业展厅,还是各类大型展会,空间展示早已摆脱了传统的图文陈列,向着“文化叙事数字体验”的方向深度转型。未来的展馆与展台,将更…

2026/10/5 3:17:16

主图反向搜索:速卖通产品跨平台扩张潜力评估实操指南

不少做跨境电商的朋友都有过这种体会:在速卖通上出了一款还不错的品,订单慢慢起来了,但总觉得天花板有点低。然后就会想,这产品能不能同步到亚马逊、Temu、Shopee或者Lazada去卖?问题就卡在第一步——怎么判断它值得扩…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑