Java 应用程序执行以下操作:
SecureRandom random = new SecureRandom();
for(int i=0;i<12;i++){
random.nextInt(19);
}
在 random.nextInt() 处,java 冻结了几分钟,似乎无限期地挂起。
奇怪的是,只有当我通过 Jenkins 运行它时,该行为才会出现,并且我无法在本地重现该问题。
在生产中代码也运行良好。
jenkins代理是Ubuntu的,但是如果我将其更改为macOS代理,它就可以正常工作。
生产运行在 openSUSE 上。
这里有什么魔力?
请使用
ThreadLocalRandom.current().nextInt()
来代替。
编辑:ThreadLocalRandom 不“安全”。
仅当您的案例对安全不敏感时才使用此选项。
SecureRandom 符合 FIPS 140-2 标准,请参阅:
向运行器添加 JVM 参数:
-Djava.security.egd=file:/dev/./urandom
所以这有点棘手。
SecureRandom
依赖于操作系统随机生成器,默认为 /dev/random
。/dev/random
依赖于环境噪音,例如鼠标输入。/dev/random
会被设计阻挡。 (实际上取决于Linux发行版)30 karakter almafa körtefa bableves