@Sharable
对于@Sharable
文档里面是这样说明的
对于这种用法指在多个ChannelPipeline
中共享同一个ChannelHandler
,对应的ChannelHandler
必须要使用@Sharable
注解标注;否则,试图将它添加到多个ChannelPipeline
时将会触发异常。
@Sharable
其实就是一个标识型的注解
,可以认为我们标识这个ChannelHandler
是线程安全的。
下面例子中ChannelInboundHandler1
是无状态的,ChannelInboundHandler2
是有状态的。ChannelInboundHandler1
天然是线程安全的,我们在多个ChannelPipeline
使用同一个Handler示例就可以减少对象的频繁创建和垃圾回收。如果想在多个ChannelPipeline
中共享ChannelInboundHandler1
实例就要将其标注为@Sharable
,否则需要每次都new
一个新的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @ChannelHandler.Sharable class ChannelInboundHandler1 extends ChannelInboundHandlerAdapter { }
class ChannelInboundHandler2 extends ChannelInboundHandlerAdapter { private ChannelHandlerContext ctx;
@Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { this.ctx = ctx; } }
public class WebSocketChatServerInitializer extends ChannelInitializer<SocketChannel> { private final ChannelInboundHandler1 channelInboundHandler1 = new ChannelInboundHandler1();
@Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("channelInboundHandler1", channelInboundHandler1); pipeline.addLast("channelInboundHandler2", new ChannelInboundHandler2()); } }
|