@Sharable的真实含义

1.当netty尝试往多个channel的pipeline中添加同一个ChannelHandlerAdapter实例时,会判断该实例类是否添加了@Sharable,没有则抛出... is not a @Sharable handler, so can't be added or removed multiple times异常

如果你添加的不是单例Handler,你加不加@Sharable没有任何区别

如果你添加的是单例Handler,只要它会被添加到多个channel的pipeline,那就必须加上@Sharable

2.网上有些资料说netty会将注解了@Sharable的Handler单例化,实在误导人。channelHandler是不是单例跟netty没有任何关系,netty只会在你尝试用单例ChannelHandler时加上第1条说明的限制,这个限制意思很明确,多个channel公用单例ChannelHandler,那它就必须是线程安全的,@Sharable就是用于告诉netty,我这个Handler是线程安全的,可以被多个channel安全的share,假如你搞了个线程不安全的类,你对它用上了单例,还加个@Sharable,这时候netty拿你也没办法,只是你的老板可能会有点不开心

一般情况下,我们的代码是这样:

bootstrap.childHandler(new ChannelInitializer<Channel>() {

@Override

protected void initChannel(Channel ch) throws Exception {

ch.pipeline().addLast(new ShareTestChannelHandler());

};

});

在initChannel方法中,我们addLast传入的Handler实例,他是不是单例的与netty没有任何关系和你是否注解@Sharable也没有任何关系

就拿上面的代码说,它就不是单例的,每次都是new一个新对象,这时候你加不加@Sharable没有任何区别

如果,你传入一个单例的Handler对象,只要它会被添加到多个channel的pipeline链中,那它就必须是@Sharable的,不然就抛出第1点说的异常:

bootstrap.childHandler(new ChannelInitializer<Channel>() {

@Override

protected void initChannel(Channel ch) throws Exception {

ch.pipeline().addLast(ShareTestChannelHandler.INSTANCE);

};

});

@Sharable

public class ShareTestChannelHandler extends SimpleChannelInboundHandler<ByteBuf>

public static ShareTestChannelHandler INSTANCE = new ShareTestChannelHandler();

private ShareTestChannelHandler() {}

......

}

那是不是所有Handler都可以加上@Sharable呢?

不是,netty中,解码器有关的Handler都是不安全的,因为粘包拆包的缘故,Decoder必须要保存一些解析过程的中间状态,比如ByteToMessageDecoder类中维护的一个字节累加器cumulation,每次读到当前channel的消息后都会将消息累加到cumulation中,然后再调用子类实现的decode方法。

所以它不能被多个channel安全的共享,netty明确的禁止了使用单例Decoder,即使你自作聪明的给他加上@Sharable,也会被禁止掉,抛出... is not allowed to be shared错误,所以我们在添加Decoder时,1必须不是单例,2不要添加@Sharable

关于netty的@Sharable注解含义,你可bie瞎说了相关推荐

  1. spring AOP注解含义

    spring AOP 的几个注解含义 @Aspect                                                              指定一个类为切面类 @P ...

  2. @aspect注解类不生效_Spring Boot从入门到精通(三)常用注解含义及用法分析总结...

    Spring Boot是目前非常流行的框架,而注解是Spring Boot的核心功能,接下来主要说一说Spring Boot常用注解的含义以及部分注解在项目中的使用方法. @RestControlle ...

  3. HystrixCommand注解含义

    public interface HystrixCommand {// HystrixCommand 命令所属的组的名称:默认注解方法类的名称String groupKey() default &qu ...

  4. @Deprecated注解 含义及用途

    @Deprecated注解 @Deprecated注解说明 用途 @Deprecated注解说明 表示此方法已废弃.暂时可用,但以后此类或方法都不会再更新.后期可能会删除,建议后来人不要调用此方法. ...

  5. 网络编程(四):Netty

    简述 基于Netty的知名项目 数据库:Cassandra 大数据处理:Spark.Hadoop 消息中间件:RocketMQ 检索:Elasticsearch 框架:gRPC.Apache Dubb ...

  6. Netty @Sharable的使用

    一.@Sharable的真实含义 当netty尝试往多个channel的pipeline中添加同一个ChannelHandlerAdapter实例时,会判断该实例类是否添加了@Sharable,没有则 ...

  7. Netty中重连可能出现 is not a @Sharable handler 报错的处理方法

    netty重连报错 场景描述 问题分析 处理方法 补充说明 参考连接: 场景描述 采用netty时进行udp的连接,代码如下,初始连接正常,当网络进行重连时就开始报错:is not a @Sharab ...

  8. SpringBoot注解@Component、Repository、Service、Controller的含义

    注解 含义 @Component 最普通的组件,可以被注入到spring容器进行管理 @Repository 作用于持久层 @Service 作用于业务逻辑层 @Controller 作用于表现层(s ...

  9. @Component注解的含义

     "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点人工智能教程可以跳转到教程. 一.注解 ...

最新文章

  1. 突发奇想写的一篇小科幻(如果可以叫做科幻的话)
  2. 性能案例-Linux下解决time_wait连接过多(Linux内核优化)
  3. 给PUBG Mobile打上几十个数据标签解析霸榜原因
  4. 新闻发布项目——访问温馨提示
  5. Arduino笔记-呼吸流水灯
  6. linux vi设置技巧,vi 技巧
  7. HDU4508 完全背包
  8. CentOS 7.5 重置 root 密码
  9. Spark standalone运行模式(图文详解)
  10. BroadCastReceive的理解和使用
  11. android 7.1 灭屏,oppocolorosv7.1怎么设置息屏时钟
  12. endnoteX9英文参考文献格式下载和导入
  13. 高通骁龙888开始被Linux内核5.12版正式支持
  14. 使用ps修改图片大小不影响清晰度的方法
  15. 基于LabVIEW的WIFI通信人机交互界面设计
  16. 抖音常见的十种变现方式
  17. 《迅雷链精品课》第四课:区块链技术的发展趋势
  18. 奇安信Java后端一面
  19. Photoshop 中的彩蛋
  20. 全球地形起伏模型ETOPO1

热门文章

  1. 区块链是什么意思?区块链的概念及特点
  2. for循环的学习心得
  3. 关于c++中的一个母牛生小牛的问题详细解答与体会
  4. Android App屏幕旋转要点
  5. Ultraiso制作Centos7 优盘Udisk 启动镜像
  6. c#等比例缩放、压缩gif、动图文件
  7. How to Install Cinnamon Desktop on Ubuntu
  8. php做到聊天发图片,网页聊天框发送表情图片实现方法
  9. 计算机临床医学自动化哪个好,这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重...
  10. 史密斯探测证实,BioFlash可检出空气中的SARS-CoV-2变异株,包括德尔塔和德尔塔+