SecureRandom线程安全吗?

SecureRandom线程安全吗? 也就是说,在初始化之后,可以依靠下一个随机数来获得线程安全吗? 检查源代码似乎表明它是,并且这个错误报告似乎表明它缺乏文档作为线程安全是一个javadoc问题。 有没有人确认它实际上是线程安全的?

是的。 它扩展了Random ,它始终有一个事实上的线程安全的实现,并且从Java 7中明确地保证了thread安全。

如果许multithreading正在使用一个SecureRandom ,则可能会造成损害性能的争用。 另一方面,初始化SecureRandom实例可能相对较慢。 无论是最好共享全局RNG,还是为每个线程创build一个新的RNG,都取决于您的应用程序。 ThreadLocalRandom类可以用作模式来提供支持SecureRandom的解决scheme。

SecureRandom的当前实现是线程安全的,特别是两个变异方法nextBytes(bytes[])setSeed(byte[])是同步的。

那么,据我所知,所有的变异方法最终都是通过这两种方法进行路由, SecureRandomRandom重写了一些方法来确保这一点。 如果将来实施方式发生变化,那么这种方法可能会很脆弱。

最好的解决scheme是首先在SecureRandom实例上手动同步。 这意味着每个调用堆栈将获得同一对象上的两个锁,但是在现代JVM上这通常非常便宜。 也就是说,明确地同步自己没有太大的伤害。 例如:

  SecureRandom rnd = ...; byte[] b = new byte[NRANDOM_BYTES]; synchronized (rnd) { rnd.nextBytes(b); } 

是。 这完全是线程安全的。 其实我会抱怨这个锁太咄咄逼人。 整个engineNextBytes()是同步的。

坦率地说,我不知道这是不是安全的。 线程问题可能会引入更多的随机性:)