Yis*_*hai 97 java thread-safety
是SecureRandom线程安全的?也就是说,在初始化之后,可以访问依赖的下一个随机数是线程安全的吗?检查源代码似乎表明它是,并且这个错误报告似乎表明它缺乏文档作为线程安全是一个javadoc问题.有人确认它实际上是线程安全的吗?
eri*_*son 100
是的.它扩展了Random,它始终具有事实上的线程安全实现,并且从Java 7中明确地保证了线程的安全性.
如果许多线程使用单个线程SecureRandom,则可能存在损害性能的争用.另一方面,初始化SecureRandom实例可能相对较慢.是否最好共享全局RNG,或者为每个线程创建一个新RNG取决于您的应用程序.的ThreadLocalRandom类可以被用作图案,以提供支持的解决方案SecureRandom.
Mat*_*ail 11
当前的实现SecureRandom是线程安全的,特别是两个变异方法nextBytes(bytes[])并且setSeed(byte[])是同步的.
好吧,据我所知,所有变异方法最终都通过这两种方法进行路由,并SecureRandom覆盖了一些方法Random以确保这一点.哪个有效,但如果将来改变实施可能会很脆弱.
最好的解决方案是SecureRandom首先在实例上手动同步.这意味着每个调用堆栈将在同一对象上获取两个锁,但这在现代JVM上通常非常便宜.也就是说,明确同步自己并没有太大的危害.例如:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19222 次 |
| 最近记录: |