我对通道管道上游/下游处理程序的并发有一个疑问。我一直认为,如果在构造管道时会创建一个新的处理程序(即,在管道中没有共享处理程序),则最多只能与处理程序相互作用。

现在,我正在浏览示例。更具体,以此为例: http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/netty/example/discard/discard/discarderserverhandler.html

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

private final AtomicLong transferredBytes = new AtomicLong();

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

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

因此,处理程序没有共享。我找不到他们想在这里使用原子能而不是简单的原因的原因。有人可以解释吗?

谢谢!

有帮助吗?

解决方案

在示例中,它是一个“错误”。这里不需要原子。所以你是对的。如果您在每个ChannelPipeline创建中添加了处理程序的新实例,则不需要打扰这种并发问题。

我将在Netty中修复示例。谢谢!

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