问题

在当前的性能管理系统中,系统会通过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返回的实例非线程安全相关推荐

  1. java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)

    转载 转载自:http://www.tuicool.com/articles/nMNVVj Java 自带的数据加密类MessageDigest(MD5或SHA加密) 说明: 在网站中,为了保护网站会 ...

  2. java多线程安全解决方案_《Java多线程编程核心技术(第2版)》 —1.2.8 实例变量共享造成的非线程安全问题与解决方案...

    1.2.8 实例变量共享造成的非线程安全问题与解决方案 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间交互时是很重要的技术点. 1.不共享数据的情况 不共享数据的情况如图 ...

  3. java str2date,java date类与string类实例代码分享

    Date类用来指定日期和时间,其构造函数及常用方法如下: publicDate() 从当前时间构造日期时间对象. publicStringtoString() 转换成字符串. publiclongge ...

  4. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  5. SpringMVC 实例 --非注解【过时的,留作回忆】

    练习项目:test SpringMVC 实例 --非注解,只用于学习理解.到了spring 3.0以后或许部分东西已经过时了,在实际工作中并不一定好用. 但对于理解SpringMVC的实现方式很有帮助 ...

  6. Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成,对java正则表达式提取字符的方式实例感兴趣的朋友一起学习吧 正好遇到一个 ...

  7. Java基础文档,图文并茂+代码实例

    写在前面: 本文为本人在期末复习时临时撰写的java复习文档,其中引用的他人内容均已添加链接.吐血整理数万字+数十张图片+示例代码,希望本文能对你有所帮助. 1.java概述 一次编程,到处运行 .j ...

  8. Java之加密工具类java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils

    Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils) 1. java ...

  9. 反射 -- 业务需求:执行某个类中全部的以test为开头的无参数无返回值的非静态方法。...

    package demo; //业务需求:执行某个类中全部的以test为开头的无参数无返回值的非静态方法. import java.lang.reflect.Method; import java.u ...

  10. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

最新文章

  1. linux下curl的使用
  2. 组织软件测试中应当避免的几个常见现象
  3. 东京奥运会的官网的最上面是广告栏
  4. Cpp 11 / 万能引用、引用折叠和完美转发
  5. linux系统下怎么修改sshd端口?
  6. 使用MessageFormat格式化数字,日期
  7. 《混合云计算》——2.2 结合服务创建混合云环境
  8. python3学习笔记(9)_closure
  9. matlab mex路径,使用matlab进行mex编译时的路径问题mexopts
  10. Java中的Comparable和Comparator到底该怎么用看完就全明白了
  11. Spring和Quartz配合实现定时任务
  12. 时间序列分析导论书摘:确定自回归过程的阶数
  13. SQL Server 版本变更检查
  14. 喜庆访问量达到10万
  15. JB的Python之旅-爬虫篇--requestsScrapy
  16. MAC PHP集成环境安装MAMP
  17. OCR证件识别及其衍生产品介绍
  18. 深度学习(三)——深层神经网络
  19. 一念起,万水千山;一念灭,沧海桑田。
  20. 云XR平台支持沉浸式体验应用快速落地

热门文章

  1. js一键批量打印_前端vue项目实现批量打印功能
  2. excel查询mysql数据库表,?如何通过Excel查询MySQL数据库
  3. SqlServer利用ODBC连接Mysql数据库
  4. PHP 生成 ppt,PHP导出PPT方法,PowerPoint/PhpPresentation处理
  5. 一个可以免费下载数据集的网站
  6. 图层重命名快捷键_实际操作,在PS中如何批量给图层重命名并导出
  7. 菲波那切数列java_斐波那契数列—java实现
  8. 自动化测试项目实战训练【广州8月】
  9. DSP之CCS软件使用一
  10. 基于Java生鲜蔬菜食品商城系统详细设计和实现