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用户论坛档案中的以下主题。

http://netty.markmail.org/search/?q=memory+Visibility+In+Handlers #query:memory%20Visibility%20IN%20HANDLERS+PAGE:1+ MID:CMTW5OMCXBG67SHO+State:Results

http://netty.markmail.org/search/?q= periodic%20Timertask%20In#query:periodic%20timertask%20in+page:2+ mid:vwahepiois4eqwkp+State:Results:vwahepiois4eqwkp+State:Results

其他提示

当您创建网络时 ChannelPipeline 如果添加 相同的 你的实例 Handler 对于所有频道,是的,多个线程将读取/修改您的数据。

如果创建一个新实例 Handler 如下所示,您的管道中的每个渠道都可以安全,只有 一个线程 将在 管道 那一次。

ChannelPipeline p = Channels.pipeline();
pipeline.addLast("handler", new Handler());

也看看Netty 渠道, ,就像爪哇 ThreadLocal 您可以按每个频道设置状态

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top