为什么 SelectorProvider 是单例模式的, 还要做为参数传来传去呢? 有何意义?

来源:5-7 新连接接入总结

慕哥8298992

2019-03-01

SelectorProivder 是在 NioEventGroup 的构造函数中传递的, 其实是为了创建 Child 即 NioEventLoop

//NioEventLoopGroup 的构造函数
    public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,
                             final SelectorProvider selectorProvider,
                             final SelectStrategyFactory selectStrategyFactory) {
        super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory,
                RejectedExecutionHandlers.reject());
    }


// NioEventLoop 的构造函数
    NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,
                 SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {
        super(parent, executor, false, DEFAULT_MAX_PENDING_TASKS, rejectedExecutionHandler);
        if (selectorProvider == null) {
            throw new NullPointerException("selectorProvider");
        }
        if (strategy == null) {
            throw new NullPointerException("selectStrategy");
        }
        provider = selectorProvider;
        selector = openSelector();
        selectStrategy = strategy;
    }

我理解这个 SelectorProvider 是个单例, 在代码的任何地方调用 SelectorProvider.provider() 返回的实例都是一样的, 为啥 netty 作者要多此一举呢?

    public static SelectorProvider provider() {
        synchronized (lock) {
            if (provider != null)
                return provider;
            return AccessController.doPrivileged(
                new PrivilegedAction<SelectorProvider>() {
                    public SelectorProvider run() {
                            if (loadProviderFromProperty())
                                return provider;
                            if (loadProviderAsService())
                                return provider;
                            provider = sun.nio.ch.DefaultSelectorProvider.create();
                            return provider;
                        }
                    });
        }
    }
写回答

1回答

闪电侠

2019-03-02

我看了一下,这个地方确实是可以减少一个参数传递,不用在 NioEventLoopGroup 中传递到 NioEventLoop

0
1
慕哥8298992
非常感谢!
2019-03-02
共1条回复

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程