Netty之@Sharable注解

1.背景

熟悉Netty的人都了解,netty为每个连接的客户端都会创建一个channel用于通信相关。每个channel都绑定到一条channelpipeline上。而channelpipeline里由一个一个的节点channelhandler组成(严格来说是channelhandlercontext)。如果为所有channel都实例化各个channelhandler的话,那对于内存还是性能来说无疑是浪费的。

因此, @Shareable注解应运而生。

2.@Shareable注解说明

@Shareable注解的handler能够被多个ChannelPipeline公用。能够被标记的handler必须是无状态的,例如没有成员变量(成员变量是线程私有的除外)。源代码的注释如下:

    /*** Indicates that the same instance of the annotated {@link ChannelHandler}* can be added to one or more {@link ChannelPipeline}s multiple times* without a race condition.* <p>* If this annotation is not specified, you have to create a new handler* instance every time you add it to a pipeline because it has unshared* state such as member variables.* <p>* This annotation is provided for documentation purpose, just like* <a href="http://www.javaconcurrencyinpractice.com/annotations/doc/">the JCIP annotations</a>.*/@Inherited@Documented@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@interface Sharable {// no value}

 如果你自定义的一个channelhandler希望实现在所有channelpipeline共享,那就可以加上@Shareable注解。

3.@Shareable注解使用限制

需要注意的是,不是所有的handler都可以添加这个注解的,被修饰的handler必须是无状态的,或者说,线程安全的。例如,如果解码器继承自ByteToMessageDecoder,就不能添加该注解。因为ByteToMessageDecoder类里含有成员变量。

如果ByteToMessageDecoder的子类不小心加上该注解,则在实例化的时候会报异常(java.lang.IllegalStateException: ChannelHandler XXX is not allowed to be shared),代码如下:

4. @Shareable注解的正确使用姿势

即使channelhandler是无状态的,申明@Shareable注解之后,也应该保证handler是单例的,不然无法生效。例如jforgame的NSocketServer

 如果未标注@Shareable注解,但客户端代码不小心把它当成单例使用,则在运行期会出现异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库案例学习20240316-mysql数据库异常处理分析优化过程指南2

一、简介 在开始排错Update之前&#xff0c;我们需要知道 Update 在 MySQL 中的生命周期是什么&#xff0c;MySQL 如何执行一个事务的。理解了如何执行&#xff0c;才知道如何去排查故障。 二、Update 生命周期 Server 层阶段 2.1 连接器 客户端发起一个 TCP 请求后&#xf…

(四)PySpark3:Mlib机器学习实战-信用卡交易数据异常检测

目录 一、Spark Mlib 二、案例背景以及数据集 三、代码 四、总结 PySpark系列文章&#xff1a; &#xff08;一&#xff09;PySpark3&#xff1a;安装教程及RDD编程 &#xff08;二&#xff09;PySpark3&#xff1a;SparkSQL编程 &#xff08;三&#xff09;PySpark3&am…

比特币,区块链及相关概念简介(一)

目录 什么是比特币比特币用来交易什么呢应用场景和黄金的关系相似之处&#xff1a;不同之处&#xff1a; 如果是交易才会有比特币奖励 那第一个持有者是怎么获取的呢 又是怎么交易的呢其他加密货币 以下内容结合了chatgpt 3.5以及网络文章。 用于学习记录。 简介&#xff1a; 介…

C++ filesystem库介绍

filesystem 库源自 boost.filesystem 库,在 C++17 中被合并进 C++ 标准库中。filesystem 库它提供了一组用于处理文件系统操作的类和函数。该库为处理文件、目录和路径提供了简单而强大的接口,使得文件系统操作变得更加方便和可移植。 下面是 <filesystem> 库中一些主…

【蓝桥杯选拔赛真题38】C++判断数字 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C判断数字 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C判断数字 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个正整数N(100≤N<100000)…

nginx实时流量拷贝ngx_http_mirror_module

参考&#xff1a; Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口&#xff0c;想实时拷贝这个请求转发到自己的服务上&#xff0c;可以使用ngx_http_mirror_module模块。 官网好像…

(done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW

一个视频&#xff1a;https://www.bilibili.com/video/BV1mb4y1y7EB/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这里有个视频&#xff0c;讲解得更加生动形象一些 总得来说&#xff0c;词袋模型(Bow, bag-of-words) 是最简…

SpringBoot之yml与properties配置文件格式的区别

概念: SpringBoot支持两种格式的配置文件,一种是yml,而另一种就是properties,默认的文件名为application.yml或者.properties 为什么有了properties之后还要有yml呢? 因为properties配置文件存在数据冗余性,在properties配置文件中一切配置都需要从头写到为, 并且Key不能重复,…

PHP+golang开源办公系统CRM管理系统

基于ThinkPHP6 Layui MySQL的企业办公系统。集成系统设置、人事管理、消息管理、审批管理、日常办公、客户管理、合同管理、项目管理、财务管理、电销接口集成、在线签章等模块。系统简约&#xff0c;易于功能扩展&#xff0c;方便二次开发。 服务器运行环境要求 PHP > 7.…

手搭手RocketMQ发送消息

消息中间件的对比 消息中间件 ActiveMQ RabbitMQ RocketMQ kafka 开发语言 java erlang java scala 单击吞吐量 万级 万级 10万级 10万级 时效性 ms us ms ms 可用性 高(主从架构) 高(主从架构) 非常高(主从架构) 非常高(主从架构) 消息中间件: acti…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树&#xff1a;对于任一结点&#xff0c; 其左子树中所有结点的键值小于该结点的键值&#xff1b;其右子树中所有结点的键值大于等于该结点的键值&#xff1b;其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”&#xf…

Linux|centos7|postgresql数据库|yum和编译方式安装总结(全系版本)

一、 yum方式安装postgresql 这个是官方的yum源&#xff0c;包括postgresql的开发包&#xff0c;lib库什么的&#xff0c;很齐全&#xff0c;关键是包括pgbackrest yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-la…

Luckysheet + Exceljs:H5实现Excel在线编辑、导入、导出及上传服务器的示例代码(完整版demo)

创建xeditor.html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>Hello World!</title><!-- <link relstylesheet href./luckysheet/plugins/css/pluginsCss.css /><link relstylesheet href./luck…

【 代码随想录算法训练营第二十四天 | LeetCode77. 组合 】

代码随想录算法训练营第二十四天 | LeetCode77. 组合 一、77. 组合 解题代码C&#xff1a; class Solution { private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, …

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误&#xff1a;IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧&#xff0c;但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧&#xff01;咋整呢&#xff1f;听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

vscode通过多个跳板机连接目标机(两种方案亲测成功)

1、ProxyJump&#xff08;推荐使用&#xff09; 需要OpenSSH 7.3以上版本才可使用&#xff0c;可用下列命令查看&#xff1a; ssh -V ProxyJump命令行使用方法 ssh -J [email protected]:port1,[email protected]:port2 一层跳板机&#xff1a; ssh dst_usernamedst_ip -…

基于Keras的模型剪枝(Pruning)

目录 设置在不修剪的情况下为 MNIST 训练模型评估基线测试准确性并保存模型以供以后使用预训练模型 Pruning根据 baseline 训练和评估模型Create 3x smaller modelsCreate a 10x smaller model from combining pruning and quantizationSee persistence of accuracy from TF to…

ARP和DDOS攻击防御介绍

学习目标&#xff1a; 1. 如何利用ARP漏洞进行攻击&#xff1f; 2. 怎样有效地防御ARP攻击&#xff1f; 3. 如何应对DDOS攻击&#xff1f; ARP攻击如何产生&#xff1f; ARP如何进行有效防御&#xff1f; ARP基础工作原理&#xff1a; 交换机会根据mac地址表&#xff0c;进行转…

JAVA中类,方法,构造函数,对象区别

在JAVA中&#xff0c;类&#xff08;Class&#xff09;是一个蓝图或模板&#xff0c;用于描述如何创建对象。它定义了对象的属性和方法。 方法&#xff08;Method&#xff09;是类或对象中可执行的操作。它用于执行特定的任务或操作。方法定义在类中&#xff0c;可以被对象调用…