发布时间:2026/7/1 14:31:19
第一章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/7/1 14:31:19

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

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

2026/7/1 15:31:23

WiFi热图绘制终极指南:3分钟学会免费网络优化神器

WiFi热图绘制终极指南:3分钟学会免费网络优化神器 【免费下载链接】wifi-heat-mapper whm also known as wifi-heat-mapper is a Python library for benchmarking Wi-Fi networks and gather useful metrics that can be converted into meaningful easy-to-unders…

2026/7/1 15:31:23

mba研究生论文文献综述怎么写

mba研究生论文文献综述怎么写 深夜,你对着电脑屏幕,几十篇文献的PDF窗口层层叠叠,笔记软件里塞满了零散的摘录,却怎么也理不出一个清晰的逻辑主线。导师那句“文献综述不是文献堆砌,要体现你的批判性思维和整合能力”…

2026/7/1 15:31:23

Sunshine游戏串流服务器:打破设备界限的游戏自由解决方案

Sunshine游戏串流服务器:打破设备界限的游戏自由解决方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下这样的场景:你坐在客厅的沙发上&#xff…

2026/7/1 15:31:23

LTC6904与PIC18F26J11构建高精度方波信号发生器

1. 项目背景与核心价值在嵌入式系统和电子测量领域,精确的方波信号发生器是许多应用的基础模块。LTC6904作为一款低功耗、高精度的可编程振荡器,与PIC18F26J11微控制器的组合,能够构建出频率稳定度优于0.5%的方波信号源。这种组合特别适合需要…

2026/7/1 15:31:23

Sunshine游戏串流服务器:5分钟搭建你的跨平台游戏串流系统

Sunshine游戏串流服务器:5分钟搭建你的跨平台游戏串流系统 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款免费开源的自托管游戏串流服务器,…

2026/7/1 0:31:06

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…

2026/7/1 0:31:06

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…