关于Netty中的处理程序和并发性

时间:2011-11-29 21:09:19

标签: concurrency netty

我对通道管道的上游/下游处理程序中的并发性有疑问。我一直认为,如果在构造管道时创建了一个新的处理程序(也就是说,处理程序不在管道之间共享),最多只有一个线程与处理程序交互。

现在,我正在浏览这些示例。更具体地说,请选择以下内容:http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/DiscardServerHandler.html

在代码中,有一个成员变量(用于计算总字节数):

private final AtomicLong transferredBytes = new AtomicLong();

为什么他们在这里使用AtomicLong?处理程序的构造如下(参见http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/DiscardServer.html):

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
    public ChannelPipeline getPipeline() throws Exception {
        return Channels.pipeline(new DiscardServerHandler());
    }
 });

因此,处理程序不会被共享。我找不到他们想要在这里使用AtomicLong而不是简单长的原因。有人可以解释一下吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

示例中的“bug”。这里不需要AtomicLong。所以你是对的。如果在每个ChannelPipeline创建时添加处理程序的新实例,则不需要为此类并发问题而烦恼。

我将修复netty中的示例。谢谢!