java - SecureRandom线程安全吗?

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

Yishai asked 2019-08-13T12:17:53Z
2个解决方案
96 votes

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

如果许多线程使用单个ThreadLocalRandom,则可能存在损害性能的争用。 另一方面,初始化SecureRandom实例可能相对较慢。 是否最好共享全局RNG,或者为每个线程创建一个新RNG取决于您的应用程序。 ThreadLocalRandom类可用作模式以提供支持SecureRandom的解决方案。

erickson answered 2019-08-13T12:18:17Z
11 votes

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

好吧,据我所知,所有变异方法最终都通过这两种方法进行了传递,并且SecureRandom覆盖了Random中的一些方法来确保这一点。 哪个有效,但如果将来改变实施可能会很脆弱。

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

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }
Matt Quail answered 2019-08-13T12:19:00Z
translate from https://stackoverflow.com:/questions/1461568/is-securerandom-thread-safe