本文将基于JDK24/25的最新源码,对AbstractSelectionKey进行逐行、逐字节、逐内存屏障的深度解构。 AbstractSelectionKey固化了“取消”和“有效性检查”的算法骨架,子类只需关注平台特定的数据存储和事件通知机制。 1.2SPI包的访问控制哲学注意AbstractSelectionKey所在的包名java.nio.channels.spi。 6.3对虚拟线程的适配虽然AbstractSelectionKey本身不涉及虚拟线程,但其无锁设计对虚拟线程至关重要。 第九章:总结与展望AbstractSelectionKey以不到60行的代码,承载了NIO取消语义的全部复杂性。
protectedabstract将实际注册工作委托给平台实现implCloseSelector()protectedabstract将实际关闭工作委托给平台实现cancel()package-private仅允许同包的AbstractSelectionKey privatestaticfinalVarHandleCLOSED=MhUtil.findVarHandle(MethodHandles.lookup(),"closed",boolean.class);privatevolatilebooleanclosed;与AbstractSelectionKey voidcancel(SelectionKeyk){//package-privatesynchronized(cancelledKeys){cancelledKeys.add(k);}}关键点:包级私有:仅AbstractSelectionKey.cancel 第六章:JDK25的现代演进与设计趋势6.1VarHandle的全面标准化AbstractSelector与AbstractSelectionKey、AbstractInterruptibleChannel
interestOps 和 readyOps 被声明在 SelectionKey 子类 SelectionKeyImpl 中,代码如下: public class SelectionKeyImpl extends AbstractSelectionKey keys 集合可由 selector.keys() 方法获取 keys.add(ski); } } public class SelectionKeyImpl extends AbstractSelectionKey selectedKeys 中移除选择键 keys.remove(ski); selectedKeys.remove(ski); // 注销选择键 deregister((AbstractSelectionKey
ski.setIndex(-1); keys.remove(ski); selectedKeys.remove(ski); deregister((AbstractSelectionKey
ski.setIndex(-1); keys.remove(ski); selectedKeys.remove(ski); deregister((AbstractSelectionKey
ski.setIndex(-1); keys.remove(ski); selectedKeys.remove(ski); deregister((AbstractSelectionKey
key from keys and selectedKeys keys.remove(ski); selectedKeys.remove(ski); deregister((AbstractSelectionKey
keyLock){if(keys==null)return;for(inti=0;i<keys.length;i++)if(keys[i]==k){keys[i]=null;keyCount--;}((AbstractSelectionKey **立即失效Key**:在从数组中移除引用后,立即调用`((AbstractSelectionKey)k).invalidate()`。这确保了Key的状态与通道的内部状态保持一致。
AbstractInterruptibleChannel.class classes/java/nio/channels/spi/AbstractSelectableChannel.class classes/java/nio/channels/spi/AbstractSelectionKey.class