2011-11-29 72 views
1

我對通道管道的上游/下游處理程序的併發性有疑問。我一直認爲,如果在構建管道時(即,管道不在管道之間共享)創建新的處理程序,則最多一個線程與處理程序進行交互。關於Netty和併發處理程序

現在,我正在瀏覽示例。更具體的,藉此之一:http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/DiscardServerHandler.html

在代碼中,有一個成員變量(它被用於計算的總字節數):爲什麼他們在這裏使用的AtomicLong

private final AtomicLong transferredBytes = new 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,而不是一個簡單的長期的原因。有人可以解釋嗎?

謝謝!

回答

6

它在示例中是一個「bug」。這裏不需要AtomicLong。所以你是對的。如果在每個ChannelPipeline創建中添加處理程序的新實例,則不需要擔心這種併發問題。

我會在netty中修正這個例子。謝謝!

+0

非常感謝您的確認! –

+0

我們如何確定哪種情況下我們應該使用可共享,或者我們應該創建新的處理程序? –

+0

@Sharable意味着您可以安全地在不同的ChannelPipelines中擁有相同的實例... –