netty中的channelHandler注释@sharable后是否代表多个io线程共享的一个单例模式呢

Netty中的@Sharable注解并不意味着channelHandler是单例模式。它表示该Handler线程安全,可添加到多个pipeline。每个连接的责任链中,Handler对象的创建取决于initChannel时addLast函数的实现,可能是共享实例或每次新建。
摘要由CSDN通过智能技术生成

根据自己的理解来解答这个问题,有理解错误的地方还望多多指点。

首先说下答案吧,答案是否定的。

@sharable注释的channelHandler类只是说明该类的实现应该是线程安全的,且一个实例可以被添加到多个pipeline中, netty框架底层并没有根据该标识将channelHandler类声明为是单例模式的。

每个连接都有一个责任链,但责任链里的channelHandler对象是可以共享的,要看在实现initChannel时addLast函数里的对象是每次都new一个新的对象,还是共享的同一个对象。如下两个例子:

//生成责任链的工具对象
public class ThriftServerInitializer  extends ChannelInitializer<SocketChannel> {
    private ThriftEncoder thriftEncoder = new ThriftEncoder();
    private ThriftDecoder thriftDecoder = new ThriftDecoder(4);
    private ThriftServerHandler thriftServerHandler = new ThriftServerHandler();
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        //这样所有的线程共享一个thriftServerHandler, thriftEncoder, thriftDecoder对象,减少了对象的创建次数, 否则的话一个连接会穿件一个责任对象链
        //但当共享数据时要小心数据的同步
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值