当前位置: 首页 > news >正文

线程池的使用 + MD5加密 + 枚举类

文章目录

  • 1、线程池的使用
  • 2、MD5算法的使用
  • 3、多用枚举类

整理下近期干活儿遇到的一些坑。

1、线程池的使用

不合理点1

jstack线程转储发现,有几万个线程,查看代码发现,线程池放在方法内部或者循环体中创建,尽管方法最后有shutdown关闭线程池,但一定并发调用下线程数量会激增

改进:

使用成员变量放线程池

不合理点2:

非单例Bean,或者一个普通的类中,线程池放成员变量了,但没有static修饰,正好其所在类被大量创建对象,一个对象一个线程池,大量线程池被创建

在这里插入图片描述

改进:

使用static修饰成员变量,即某个属性所有对象都相同,与之相反的是实例变量,即某个属性一个对象一份,如名字、身高

2、MD5算法的使用

不合理点:

调用一个三方接口,有个请求参数accesskey,其可能包含反斜线、等号🟰等特殊字符,直接传可能导致接口调用失败,甚至SQL执行出错,影响系统数据

改进:

考虑做一个MD5加密,输出一个定长字符串

补充:

关于MD5算法:Message-Digest Algorithm 5,可以将任意长度的数据映射为固定长度(通常为128位)的哈希值,该过程不可逆(无法从哈希值反推原始数据),多用于数据完整性校验

输入任意长度的数据 → 经过多轮循环处理 → 输出固定长度的128位哈希值(通常表示为32位十六进制字符串)

需要注意MD5有安全性问题:不同的输入可能生成相同的哈希值(目前已构造出大量碰撞案例),因此,不适用于:

  • 密码存储(应使用 bcrypt、Argon2 等算法)。
  • 数字签名或高安全场景。

仅推荐用于:非敏感数据的快速校验,如文件完整性检查

3、多用枚举类

代码中多用枚举类代替直接创建的字符串,常用的枚举形式一:

public enum StatusEnum {SUCCESS,RUNNING
}
//代替大量的"SUCCESS"字符串
StatusEnum.SUCCESS.name()

形式二:加一个display,而不是name()后转小写,更加有灵活性

@Getter
public enum ClusterTypeEnum {RABBITMQ("rabbitmq"),MQTT("mqtt");private final String displayName;ClusterTypeEnum(String displayName) {this.displayName = displayName;}}

形式三:用于传参字段上,直接将枚举类型和String在序列化和反序列化时自动转换,如此Dto类中可以直接用枚举类型的变量,而不再要求非得String,同样的,序列化时,也会把枚举转成String:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;@Getter
@AllArgsConstructor
public enum OrderFieldEnum {CREATE_TIME("createTime", "create_time"),NAME("name","name");private final String value;  //值private final String field;  //对应数据库中的字段,方便后面写业务和Mapper层代码private static final Map<String, OrderFieldEnum> map = new HashMap<>();//@JsonCreator标记一个构造函数或静态工厂方法,告诉 Jackson 在反序列化 JSON 时应该调用该方法来创建对象实例。@JsonCreatorpublic static OrderFieldEnum check(String value) {//这里的判断map为空则遍历枚举类的值放进Map中//这个操作和上面的利用类加载时机初始化Map集合一个目的if (map.isEmpty()) {for (OrderFieldEnum orderFieldEnum : OrderFieldEnum.values()) {map.put(orderFieldEnum.getValue(), orderFieldEnum);}}//如果在Map中找不到对应的key和传入的字段相等,则认为非法传参,即不支持这个排序字段if (!map.containsKey(value)) {throw new MyExceptionHandler("不支持这个排序字段");  //自定义异常,在全局异常处理器处理}//否则返回整个枚举对象return map.get(value);}//@JsonValue标记一个方法,将该方法的返回值直接作为 JSON 的值,而不是将整个对象序列化为 JSON 对象//使用场景:当某个类本身不需要完整的 JSON 表示,只需要输出其中一个字段的值时@JsonValuepublic String getValue() {return value;}
}

详见:https://llg-notes.blog.csdn.net/article/details/130997300

http://www.lryc.cn/news/538456.html

相关文章:

  • [qt5学习笔记]Application Example示例程序源码解析
  • 【在时光的棋局中修行——论股市投资的诗意哲学】
  • IB网络错误检查工具ibqueryerrors
  • 「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南
  • 论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?
  • 25年黑龙江省考报名流程详细教程
  • 基于SpringBoot的小区运动中心预约管理系统
  • 部署postgresql_exporter监控pgsql
  • Mac本地部署deepseek
  • huggingface+下载deepseek8b lamda+本地部署 笔记
  • 中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?
  • Jedis 客户端 用于java连接redis服务
  • 车载诊断数据库 --- 通用性诊断数据库ODX
  • docker 基础命令使用(ubuntu)
  • IDEA集成DeepSeek
  • Unity 接入Luabn记录图解
  • 【MySQL】我在广州学Mysql 系列——Mysql 日志管理详解
  • 【线段树 二分查找】P3939 数颜色|普及+
  • 2011年下半年软件设计师考试上午题真题的详细知识点分类整理(附真题及答案解析)
  • tmagic-editor,腾讯开源的基于 Vue3 的页面可视化编辑器
  • K8s学习总结
  • 正则表达式(Regular expresssion)
  • Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask
  • MySQL的聚簇索引与非聚簇索引
  • vscode的一些实用操作
  • C++11 thread
  • rabbitmq五种模式的总结——附java-se实现(详细)
  • Qt中基于开源库QRencode生成二维码(附工程源码链接)
  • Java数据结构---链表
  • mongodb是怎么分库分表的