为什么 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回答
-
我看了一下,这个地方确实是可以减少一个参数传递,不用在 NioEventLoopGroup 中传递到 NioEventLoop
012019-03-02
相似问题