工作中的坑(1) securerandom

SecureRandom

Random和SecureRandom

Random是什么

randomg常用来创建伪随机数,因为只要给定一个初始的种子,所以产生的随机数是一样的,生成随机数方式可以使用方法nextInt()、nextLong()、nextFloat()、nextDouble()来生成不同类型的随机数。如果种子相同,就会生成相同的2个随机序列。
工作中的坑(1) securerandom

SecureRandom是什么

SecureRandom就是一个不可预测的安全的随机数。他无法预设制定种子,是使用的RNG(random number generator)算法来实现的。一般SecureRandom的安全的随机种子,都是通过CPU的热噪声,读写磁盘的字节,等各种随机事件产生的“熵”。
如果涉及到需要十分安全的随机数时,应该优先使用SecureRandom

SecureRandom的坑

在今天的项目准生产环境测试时,有一个功能死活用不了.还导致了出现mysql行锁,已经定位到具体的方法了肯定就好去解决了.立马就在本地环境开始测试调试。结果一测试发现,直接就跑通了没有复现??随后又把新的代码放回了服务器,再次测试,结果又出现了这个问题…当时我甚至都把事务注解给注释掉了…还以为是因为自己的update写的有问题呢…可是还不行.后来让我们同事来看了一下,才发现,原来是SecureRandom.getInstanceStrong()的方法出现了问题,因为他没有足够的随机数据提供就会持续等待,他一等待,我其他需要涉及到mysql事务提交的也在等待在这种情况下,因为存在的熵太少了.就会导致这种在线程阻塞的情况。

结论

也是网上总结、看大佬博客最后可行的解决方案还是找到了几个的
1.使用SecureRandom random = new SecureRandom();
的方式创建这种创建方式不会产生阻塞
2.针对于不是特别需要安全的还是使用Random random = new Random();的方式以时间戳为种生成。

上一篇:Centos7下tomcat关闭异常问题


下一篇:【GDOI2016模拟4.5】刺客 题解