代码之家  ›  专栏  ›  技术社区  ›  Yishai

SecureRandom线程安全吗?

  •  91
  • Yishai  · 技术社区  · 15 年前

    SecureRandom 线程安全吗?也就是说,在初始化之后,可以依赖对下一个随机数的访问来保证线程安全吗?检查源代码似乎表明它是,并且 this bug report 似乎表明它缺少线程安全的文档是一个JavaDoc问题。是否有人确认它实际上是线程安全的?

    3 回复  |  直到 8 年前
        1
  •  93
  •   erickson    8 年前

    是的,是的。它延伸 Random 一直都有一个 事实上的 线程安全实施,以及 Java 7, explicitly guarantees threadsafety.

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

        2
  •  12
  •   Matt Quail    14 年前

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

    好吧,据我所知,所有的变异方法最终都是通过这两种方法进行路由的,并且 证券证券 重写中的一些方法 Random 以确保这一点。这是可行的,但如果将来实现发生更改,可能会很脆弱。

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

        SecureRandom rnd = ...;
    
        byte[] b = new byte[NRANDOM_BYTES];
        synchronized (rnd) {
            rnd.nextBytes(b);
        }
    
        3
  •  1
  •   ZZ Coder    15 年前

    对。它是完全安全的。实际上,我会抱怨锁太猛了。整体 engineNextBytes() 已同步。

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