Netty4 引入了一个新的线程模型,也许你应该调整你的代码以获得更好的性能。这里有一些来自Netty Wiki的观点,netty4 有更多的变化。
3.x 中没有明确定义的线程模型,尽管尝试在 3.5 中修复它的不一致性。4.0 定义了一个严格的线程模型,帮助用户编写 ChannelHandler 而不必过多担心线程安全。
Netty 永远不会同时调用 ChannelHandler 的方法,除非 ChannelHandler 被 @Sharable 注解。这与处理程序方法的类型无关 - 入站、出站或生命周期事件处理程序方法。
用户不再需要同步入站或出站事件处理程序方法。
4.0 不允许多次添加 ChannelHandler,除非它使用 @Sharable 注释。
Netty 进行的每个 ChannelHandler 方法调用之间总是存在happens-before关系。
用户不需要定义 volatile 字段来保持处理程序的状态。用户可以在将处理程序添加到 ChannelPipeline 时指定 EventExecutor。
如果指定,ChannelHandler 的处理程序方法总是由指定的 EventExecutor 调用。
如果未指定,则处理程序方法始终由其关联 Channel 注册到的 EventLoop 调用。
分配给处理程序或通道的 EventExecutor 和 EventLoop 始终是单线程的。
处理程序方法将始终由同一个线程调用。
如果指定了多线程 EventExecutor 或 EventLoop,将首先选择其中一个线程,然后使用所选线程,直到取消注册。
如果同一管道中的两个处理程序分配有不同的 EventExecutor,它们会同时被调用。如果多个处理程序访问共享数据,即使共享数据仅由同一管道中的处理程序访问,用户也必须注意线程安全。添加到 ChannelFuture 的 ChannelFutureListener 总是由分配给未来关联 Channel 的 EventLoop 线程调用。