java messagedigest_Java MessageDigest.getInstance返回的实例非线程安全
问题
在当前的性能管理系统中,系统会通过Java自带的MD5 Digest为性能指标生成一个固定的列名。
但是在测试的过程中,总是会发现有些指标生成列名失败,或者列名相同。
定位及原因
生成列名代码大概如下
private static volatile MessageDigest md5MessageDigest = null;
public static String getField(String value) throws NoSuchAlgorithmException {
if (md5MessageDigest == null) {
md5MessageDigest = MessageDigest.getInstance("MD5");
}
byte[] digestBytes = md5MessageDigest.digest(value.getBytes(StandardCharsets.UTF_8));
return toField(digestBytes);
}
public static String toField(byte[] digestBytes) {
// 实际生成比下面的复杂,仅为了演示。
return "ind_" + String(digestBytes, StandardCharsets.UTF_8);
}
MessageDigest对应的MD5 Digest实例包含了个多个非静态变量,不加锁时使用同个MD5 Digest会出现多线程问题。
系统的性能指标一般是通过Excel一次性导入,导入是并发的,所以会引发上面的问题。
解决方法
每次使用MessageDigest.getInstance获取唯一的MD5 Digest。
public static String getField(String value) throws NoSuchAlgorithmException {
MessageDigest md5MessageDigest = MessageDigest.getInstance("MD5");
byte[] digestBytes = md5MessageDigest.digest(value.getBytes(StandardCharsets.UTF_8));
return toField(digestBytes);
}
public static String toField(byte[] digestBytes) {
// 实际生成比下面的复杂,仅为了演示。
return "ind_" + String(digestBytes, StandardCharsets.UTF_8);
}
java messagedigest_Java MessageDigest.getInstance返回的实例非线程安全相关推荐
- java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)
转载 转载自:http://www.tuicool.com/articles/nMNVVj Java 自带的数据加密类MessageDigest(MD5或SHA加密) 说明: 在网站中,为了保护网站会 ...
- java多线程安全解决方案_《Java多线程编程核心技术(第2版)》 —1.2.8 实例变量共享造成的非线程安全问题与解决方案...
1.2.8 实例变量共享造成的非线程安全问题与解决方案 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间交互时是很重要的技术点. 1.不共享数据的情况 不共享数据的情况如图 ...
- java str2date,java date类与string类实例代码分享
Date类用来指定日期和时间,其构造函数及常用方法如下: publicDate() 从当前时间构造日期时间对象. publicStringtoString() 转换成字符串. publiclongge ...
- java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回
java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...
- SpringMVC 实例 --非注解【过时的,留作回忆】
练习项目:test SpringMVC 实例 --非注解,只用于学习理解.到了spring 3.0以后或许部分东西已经过时了,在实际工作中并不一定好用. 但对于理解SpringMVC的实现方式很有帮助 ...
- Java正则表达式提取字符的方法实例
正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成,对java正则表达式提取字符的方式实例感兴趣的朋友一起学习吧 正好遇到一个 ...
- Java基础文档,图文并茂+代码实例
写在前面: 本文为本人在期末复习时临时撰写的java复习文档,其中引用的他人内容均已添加链接.吐血整理数万字+数十张图片+示例代码,希望本文能对你有所帮助. 1.java概述 一次编程,到处运行 .j ...
- Java之加密工具类java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils
Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils) 1. java ...
- 反射 -- 业务需求:执行某个类中全部的以test为开头的无参数无返回值的非静态方法。...
package demo; //业务需求:执行某个类中全部的以test为开头的无参数无返回值的非静态方法. import java.lang.reflect.Method; import java.u ...
- 利用Java自带的MD5加密java.security.MessageDigest;
MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...
最新文章
- linux下curl的使用
- 组织软件测试中应当避免的几个常见现象
- 东京奥运会的官网的最上面是广告栏
- Cpp 11 / 万能引用、引用折叠和完美转发
- linux系统下怎么修改sshd端口?
- 使用MessageFormat格式化数字,日期
- 《混合云计算》——2.2 结合服务创建混合云环境
- python3学习笔记(9)_closure
- matlab mex路径,使用matlab进行mex编译时的路径问题mexopts
- Java中的Comparable和Comparator到底该怎么用看完就全明白了
- Spring和Quartz配合实现定时任务
- 时间序列分析导论书摘:确定自回归过程的阶数
- SQL Server 版本变更检查
- 喜庆访问量达到10万
- JB的Python之旅-爬虫篇--requestsScrapy
- MAC PHP集成环境安装MAMP
- OCR证件识别及其衍生产品介绍
- 深度学习(三)——深层神经网络
- 一念起,万水千山;一念灭,沧海桑田。
- 云XR平台支持沉浸式体验应用快速落地
热门文章
- js一键批量打印_前端vue项目实现批量打印功能
- excel查询mysql数据库表,?如何通过Excel查询MySQL数据库
- SqlServer利用ODBC连接Mysql数据库
- PHP 生成 ppt,PHP导出PPT方法,PowerPoint/PhpPresentation处理
- 一个可以免费下载数据集的网站
- 图层重命名快捷键_实际操作,在PS中如何批量给图层重命名并导出
- 菲波那切数列java_斐波那契数列—java实现
- 自动化测试项目实战训练【广州8月】
- DSP之CCS软件使用一
- 基于Java生鲜蔬菜食品商城系统详细设计和实现