将状态保持在Netty ChannelHandler中
-
25-10-2019 - |
题
Netty文档建议使用频道手机中的实例变量来跟踪频道状态。它没有提到您应该使用挥发性变量或使用任何其他同步技术来确保跨线程具有一致的视图。
例如,以每连接使用此处理程序:
class Handler extends SimpleChannelUpstreamHandler {
int count = 0;
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
++count;
}
}
我希望来自Netty线程池的许多不同线程将调用此方法,尽管并非并发,并且可能会看到不一致的视图,从而导致计数不准确。
是这样吗?还是在Netty内部进行某种同步会导致写入计数字段的文字被冲洗?
解决方案
如果您的管道中没有执行人,并且纯粹在I/O工作线程中执行处理程序,那么NetTy可以保证您可以从同一工作人员线程中拨打给定的管道实例。
如果您正在将执行处理程序添加到管道中,那么如果您使用Netty的OrdedMemoryawareThreadPooleExecutor,则可以。
如果您是从非netty线程访问管道,或者您的管道中有一个非排序的ememoryawarethreadpoolexecutor,则需要同步。
我建议您查看Netty用户论坛档案中的以下主题。
不隶属于 StackOverflow