SecureRandom 线程安全吗?
2022-08-31 09:35:01
线程安全吗?也就是说,在初始化它之后,是否可以依赖对下一个随机数的访问来确保线程安全?检查源代码似乎表明它是,并且此错误报告似乎表明它缺乏线程安全的文档是一个javadoc问题。有没有人证实它实际上是线程安全的?SecureRandom
线程安全吗?也就是说,在初始化它之后,是否可以依赖对下一个随机数的访问来确保线程安全?检查源代码似乎表明它是,并且此错误报告似乎表明它缺乏线程安全的文档是一个javadoc问题。有没有人证实它实际上是线程安全的?SecureRandom
是的,它是。它扩展了,它总是有一个事实上的线程安全实现,并且从Java 7开始,明确保证线程安全。Random
如果许多线程使用单个 ,则可能存在损害性能的争用。另一方面,初始化实例可能相对较慢。是最好共享全局 RNG,还是为每个线程创建一个新 RNG,将取决于您的应用程序。ThreadLocalRandom
类可以用作一种模式,以提供支持 .SecureRandom
SecureRandom
SecureRandom
的当前实现是线程安全的,特别是两个突变方法并且是同步的。SecureRandom
nextBytes(bytes[])
setSeed(byte[])
好吧,据我所知,所有变异方法最终都会通过这两种方法进行路由,并重写一些方法来确保这一点。这有效,但如果将来更改实现,则可能会很脆弱。SecureRandom
Random
最佳解决方案是先在实例上手动同步。这意味着每个调用堆栈将在同一对象上获取两个锁,但这在现代JVM上通常非常便宜。也就是说,显式同步自己并没有太大的危害。例如:SecureRandom
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}