我对通道管道的上游/下游处理程序中的并发性有疑问。我一直认为,如果在构造管道时创建了一个新的处理程序(也就是说,处理程序不在管道之间共享),最多只有一个线程与处理程序交互。
现在,我正在浏览这些示例。更具体地说,请选择以下内容: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而不是简单长的原因。有人可以解释一下吗?
谢谢!
答案 0 :(得分:6)
示例中的“bug”。这里不需要AtomicLong。所以你是对的。如果在每个ChannelPipeline创建时添加处理程序的新实例,则不需要为此类并发问题而烦恼。
我将修复netty中的示例。谢谢!