SecureRandom线程安全吗?
SecureRandom
线程安全吗? 也就是说,在初始化之后,可以依靠下一个随机数来获得线程安全吗? 检查源代码似乎表明它是,并且这个错误报告似乎表明它缺乏文档作为线程安全是一个javadoc问题。 有没有人确认它实际上是线程安全的?
是的。 它扩展了Random
,它始终有一个事实上的线程安全的实现,并且从Java 7中明确地保证了thread安全。
如果许multithreading正在使用一个SecureRandom
,则可能会造成损害性能的争用。 另一方面,初始化SecureRandom
实例可能相对较慢。 无论是最好共享全局RNG,还是为每个线程创build一个新的RNG,都取决于您的应用程序。 ThreadLocalRandom
类可以用作模式来提供支持SecureRandom
的解决scheme。
SecureRandom
的当前实现是线程安全的,特别是两个变异方法nextBytes(bytes[])
和setSeed(byte[])
是同步的。
那么,据我所知,所有的变异方法最终都是通过这两种方法进行路由, SecureRandom
在Random
重写了一些方法来确保这一点。 如果将来实施方式发生变化,那么这种方法可能会很脆弱。
最好的解决scheme是首先在SecureRandom
实例上手动同步。 这意味着每个调用堆栈将获得同一对象上的两个锁,但是在现代JVM上这通常非常便宜。 也就是说,明确地同步自己没有太大的伤害。 例如:
SecureRandom rnd = ...; byte[] b = new byte[NRANDOM_BYTES]; synchronized (rnd) { rnd.nextBytes(b); }
是。 这完全是线程安全的。 其实我会抱怨这个锁太咄咄逼人。 整个engineNextBytes()
是同步的。
坦率地说,我不知道这是不是安全的。 线程问题可能会引入更多的随机性:)