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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值