美文网首页
netty:SelectedSelectionKeySet介绍

netty:SelectedSelectionKeySet介绍

作者: benbendy1984 | 来源:发表于2017-09-04 08:14 被阅读0次

介绍

SelectedSelectionKeySet用来代替Selector的selectedKeys成员和publicSelectedKeys成员,提高性能

实现

我们先来看下成员

    private SelectionKey[] keysA;
    private int keysASize;
    private SelectionKey[] keysB;
    private int keysBSize;
    private boolean isA = true;

里面通过两个数组和一个标示来进行切换的。

  SelectedSelectionKeySet() {
        keysA = new SelectionKey[1024];
        keysB = keysA.clone();
    }

构造函数中,默认给两个数组都分配了1024个空间

  @Override
    public boolean add(SelectionKey o) {
        if (o == null) {
            return false;
        }

        if (isA) {
            int size = keysASize;
            keysA[size ++] = o;
            keysASize = size;
            if (size == keysA.length) {
                doubleCapacityA();
            }
        } else {
            int size = keysBSize;
            keysB[size ++] = o;
            keysBSize = size;
            if (size == keysB.length) {
                doubleCapacityB();
            }
        }

        return true;
    }

这个添加一个元素,从代码中可以看出,首先是需要看现在在那个数组中操作,往对应的数组末尾加个元素,增加下标,最后看数组是否满了,如果满了就进行数组的扩大

 private void doubleCapacityA() {
        SelectionKey[] newKeysA = new SelectionKey[keysA.length << 1];
        System.arraycopy(keysA, 0, newKeysA, 0, keysASize);
        keysA = newKeysA;
    }

申请两倍的空间,在把原来的内容复制到新的空间。
我们在来看下个成员flip(),他主要用来获取现有的元素,并进行切换

  SelectionKey[] flip() {
        if (isA) {
            isA = false;
            keysA[keysASize] = null;
            keysBSize = 0;
            return keysA;
        } else {
            isA = true;
            keysB[keysBSize] = null;
            keysASize = 0;
            return keysB;
        }
    }

最后还有几个函数都比较简单

   @Override
    public int size() {
        if (isA) {
            return keysASize;
        } else {
            return keysBSize;
        }
    }

    @Override
    public boolean remove(Object o) {
        return false;
    }

    @Override
    public boolean contains(Object o) {
        return false;
    }

    @Override
    public Iterator<SelectionKey> iterator() {
        throw new UnsupportedOperationException();
    }

使用

在NioEventLoop类中的openSelector函数中

 private Selector openSelector() {
        final Selector selector;
        try {
            selector = provider.openSelector();
        } catch (IOException e) {
            throw new ChannelException("failed to open a new selector", e);
        }

        if (DISABLE_KEYSET_OPTIMIZATION) {
            return selector;
        }

        try {
            SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();

            Class<?> selectorImplClass =
                    Class.forName("sun.nio.ch.SelectorImpl", false, PlatformDependent.getSystemClassLoader());

            // Ensure the current selector implementation is what we can instrument.
            if (!selectorImplClass.isAssignableFrom(selector.getClass())) {
                return selector;
            }

            Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");
            Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");

            selectedKeysField.setAccessible(true);
            publicSelectedKeysField.setAccessible(true);

            selectedKeysField.set(selector, selectedKeySet);
            publicSelectedKeysField.set(selector, selectedKeySet);

            selectedKeys = selectedKeySet;
            logger.trace("Instrumented an optimized java.util.Set into: {}", selector);
        } catch (Throwable t) {
            selectedKeys = null;
            logger.trace("Failed to instrument an optimized java.util.Set into: {}", selector, t);
        }

        return selector;
    }

首先创建了一个selector和自定义的selectedKeySet,然后通过反射的机制,把selector中的两个成员: selectedKeys和publicSelectedKeys使用我们自定义的那selectKeySet代替

原理

相关文章

  • netty:SelectedSelectionKeySet介绍

    介绍 SelectedSelectionKeySet用来代替Selector的selectedKeys成员和pub...

  • Netty简单介绍(非原创)

    文章大纲 一、Netty基础介绍二、Netty代码实战三、项目源码下载四、参考文章 一、Netty基础介绍 1. ...

  • Netty学习之Netty介绍

    Netty学习之Netty介绍 前言 本周开始学习Netty,主要的参考资料是《Netty In Action》原...

  • Netty | 第2章 Netty 简介《Netty In Ac

    前言 参考资料: 《Netty In Action》; 本系列为 Netty 学习笔记,本篇介绍总结Netty 简...

  • 提升能力从学习Netty开始

    netty 介绍 一、 Netty 是什么 Netty 是一个广泛使用的 Java 网络编程框架而Netty就是基...

  • 什么是netty--通俗易懂

    一.Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty...

  • Netty基础

    网络编程框架Netty的介绍与使用 一、简介 Netty的官网https://netty.io/ Netty是一个...

  • 1.Netty入门

    Netty入门 1.Netty介绍 (1)百度百科介绍: Netty是由JBOSS提供的一个java开源框架。Ne...

  • dubbo源码6-transporter-netty4

    transporter层支持netty,mina,http等协议。本文介绍基于netty4的实现。 一 Netty...

  • netty介绍

    概念 Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,...

网友评论

      本文标题:netty:SelectedSelectionKeySet介绍

      本文链接:https://www.haomeiwen.com/subject/uppsjxtx.html