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

Jap*_* D. 1 concurrency netty

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

现在,我正在浏览这些例子.更具体地说,请看一下:http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/DiscardServerHandler.html

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

private final AtomicLong transferredBytes = new AtomicLong();
Run Code Online (Sandbox Code Playgroud)

他们为什么在这里使用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());
    }
 });
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Nor*_*rer 6

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

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