NettyとConcurrencyのハンドラーについて
-
25-10-2019 - |
質問
チャネルパイプの上流/下流のハンドラーの並行性について質問があります。パイプが構築されたときに新しいハンドラーが作成された場合(つまり、ハンドラーがパイプ間で共有されていない)、最大で1つのスレッドがハンドラーと対話するといつも思っていました。
今、私は例を閲覧していました。より具体的には、これを取ります: http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/discard/discardserverhandler.html
コードには、メンバー変数があります(バイトの総数をカウントするために使用されます):
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());
}
});
したがって、ハンドラーは共有されていません。ここでは、プレーンな長さではなく、アトミックロングを使用したい理由を見つけることができません。誰かが説明できますか?
ありがとう!
解決
その例の「バグ」。ここにアトミクロンは必要ありません。だからあなたは正しい。すべてのチャンネルパイプライン作成にハンドラーの新しいインスタンスを追加する場合、この種の並行性の問題を悩ます必要はありません。
Nettyでこの例を修正します。ありがとう!
所属していません StackOverflow