背景:公司项目需要更换新的服务器部署,但换完服务器后发现有个接口无法正常使用了,其余接口均可正常使用。
根据日志输出结果继续查看,发现其是阻塞运行中的其中一步,通过不断的增加日志最后将问题锁定到了获取随机数的方法中。
下面是原先的代码实现:
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