SecureRandom.getInstanceStron获取随机数线程阻塞

现象

Random random = SecureRandom.getInstanceStrong();该行代码在测试环境没有问题,同样的镜像包发布到UAT环境,执行改行代码时长时间未响应,

情况分析

SecureRandom.getInstanceStrong() 在linux环境下会读取操作系统的 /dev/random 文件来生成随机数,
而这个文件的数据来源于系统的扰动,比如键盘的输入、鼠标点击等等操作。当系统产生扰动很少的时候,就会导致读取这个文件的线程阻塞
(和采用的代码语言无关)。操作系统产生的这个扰动可以通过 cat /proc/sys/kernel/random/entropy_avail 查看(即系统熵值)。

解决办法

1、(强伪随机数,难以预测的随机数)采用 new SecureRandom() 实例化,这个实例化底层是读取的是操作系统的 /dev/urandom文件,这个是伪随机,相比 SecureRandom.getInstanceStrong() 方式,它的随机性稍微弱一些,但大多数场景够用了。
2、(弱伪随机数,易于预测的随机数)使用commons-lang3工具包中的RandomUtils.nextLong(起始值,结束值)方法,可以得到一个在该范围内的随机数。

推荐方法
方法2没有方法1安全性高,但是在日常的业务使用中已经足够满足业务场景,所以对安全性没那么高的业务场景,使用方法2即可

你可能感兴趣的:(java)