SecureRandom.getInstance()导致线程阻塞发生

举报
酸菜鱼136 发表于 2022/11/17 16:55:19 2022/11/17
【摘要】 SecureRandom.getInstance()导致线程阻塞发生的复盘

背景:公司项目需要更换新的服务器部署,但换完服务器后发现有个接口无法正常使用了,其余接口均可正常使用。

根据日志输出结果继续查看,发现其是阻塞运行中的其中一步,通过不断的增加日志最后将问题锁定到了获取随机数的方法中。
下面是原先的代码实现:

public static String getRandomCode(int num){
	StringBuilder randomCode = new StringBuilder();
	Random random = SecureRandom.getInstanceStrong();
	for(int i = 0; i< num; i++){
		String strRand = String.valueOf(random.nextInt(num));
		randomCode.append(strRand);
	}
	return randomCode.toString();
}

经过进一步日志打印,最后定位到String strRand = String.valueOf(random.nextInt(num));;问题就出现在一句代码上,程序一运行至此就发生了阻塞的现象。
经过百度等搜索发现,原因由于Random random = SecureRandom.getInstanceStrong();所造成的。
原因:不同的系统环境执行的底层代码不相同,在linux系统中是通过底层NativePRNG方法,通过/dev/random方式读取随机数,/dev/random方式受系统环境的影响容易造成线程阻塞;在windows系统中通过generateSeed的native方法读取,不会阻塞线程。(https://blog.csdn.net/weixin_45244678/article/details/106137948,这篇博客讲解的很详细,推荐!!)
解决方法:采用new SecureRandom()来替代SecureRandom.getInstanceStrong()即可

参考文献:
https://blog.csdn.net/qq_34207422/article/details/127664857
https://blog.csdn.net/weixin_45244678/article/details/106137948

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。