3.xに明確なスレッドモデルはありませんが、3.5ではその不一致を修正しようとしましたが、 4.0では、スレッド安全性についてあまり気にすることなく、ユーザーがChannelHandlerを書くのに役立つ厳密なスレッドモデルが定義されています。
ChannelHandlerに@Sharableというアノテーションが付けられていない限り、Nettyは決してChannelHandlerのメソッドを同時に呼び出すことはありません。これは、ハンドラ・メソッドのタイプ(インバウンド、アウトバウンド、またはライフ・サイクル・イベント・ハンドラ・メソッド)に関係なく行われます。
ユーザーは、インバウンドまたはアウトバウンドイベントハンドラメソッドをもう同期する必要はありません。
4.0では、@Sharableで注釈が付けられていない限り、ChannelHandlerを複数回追加することはできません。
Nettyによって行われた各ChannelHandlerメソッドの呼び出しの間には、常に先行する関係があります。
ユーザーは、ハンドラの状態を保持するためにvolatileフィールドを定義する必要はありません。 ユーザーは、ChannelPipelineにハンドラを追加するときにEventExecutorを指定できます。
指定された場合、ChannelHandlerのハンドラメソッドは常に、指定されたEventExecutorによって呼び出されます。
指定されていない場合、ハンドラメソッドは、関連付けられたChannelが登録されているEventLoopによって常に呼び出されます。
ハンドラまたはチャネルに割り当てられたEventExecutorおよびEventLoopは、常にシングルスレッドです。
ハンドラメソッドは常に同じスレッドによって呼び出されます。
マルチスレッドのEventExecutorまたはEventLoopが指定されている場合は、スレッドの1つが最初に選択され、選択されたスレッドが登録解除まで使用されます。
同じパイプライン内の2つのハンドラが異なるEventExecutorsで割り当てられている場合、それらは同時に呼び出されます。共有データが同じパイプラインのハンドラによってのみアクセスされたとしても、複数のハンドラが共有データにアクセスする場合、スレッドセーフティに注意する必要があります。 ChannelFutureに追加されたChannelFutureListenerは、将来の関連付けられたChannelに割り当てられたEventLoopスレッドによって常に呼び出されます。
アプリケーションのプロファイリングを試しましたか?もしそうならボトルネックはどこにありますか? –
どのスレッドプールを使用していますか?これは3-> 4移行の間に変更されていますか? –