Answers:
是的。它扩展了Random
,始终具有事实上的线程安全实现,从Java 7开始,它明确地保证了线程安全。
如果许多线程使用单个SecureRandom
,则可能存在争用,从而影响性能。另一方面,初始化SecureRandom
实例可能相对较慢。共享全局RNG还是为每个线程创建一个新的RNG取决于您的应用程序。的ThreadLocalRandom
类可以被用作图案,以提供一个解决方案,支持SecureRandom
。
SecureRandom
不仅很慢,而且可能会由于缺少熵而挂起
的当前实现SecureRandom
是线程安全的,尤其是两种变异方法nextBytes(bytes[])
并且setSeed(byte[])
是同步的。
好吧,据我所知,所有变异方法最终都会通过这两种方法进行路由,并SecureRandom
覆盖其中的一些方法Random
以确保实现这一点。哪个可行,但如果将来更改实现,可能会很脆弱。
最好的解决方案是先在SecureRandom
实例上手动同步。这意味着每个调用堆栈将在同一对象上获取两个锁,但是在现代JVM上通常非常便宜。也就是说,显式同步自己没有太大的危害。例如:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}
java.security.SecureRandom#nextBytes
Java 8中未同步。您能否指定在哪个Java版本中找到了同步的#nextBytes
?。