java - 我应该使用java.util.Random的全局实例,还是每次使用它时构造一个?

Abs*_*ane 5 java random instance-variables

标题几乎总结了它.我已经看到人们在全局构建一个Random实例,并在所有代码中使用它,我也看到人们每次想要使用Random时构造一个实例.

我的问题是:如果有的话,我应该构建一个新的Random实例来生成随机数?

Math.random()将Random实例存储在RandomNumberGeneratorHolder中,并在每次调用Math.random()时调用它.

我的观点:我应该使用全局的Random()实例,因为:

  1. 节省对象创建时间.Random()的无参数构造函数调用seedUniquifier(),它基本上循环,直到找到一个新的AtomicLong(),并将其提升到System.nanoTime()的幂.很贵.
  2. 我目前正在使用随机数进行自定义hashCode().我重写了equals(),现在我正在为hashCode()做同样的事情.我正在这样做的类将主要用于在Collections中存储数据,这严重滥用了hashCode().看到无参数的Random()构造函数将比我用于生成哈希码的几次乘法花费更多的时间,它将使执行时间增加一倍以上.不好.

我想不出更多的原因,但如果我应该使用全局Random实例,我可以想象java开发人员在实例字段中实现Random,以及特殊情况的构造函数.这告诉我,我错了.我应该使用全局随机实例吗?

Men*_*ena 6

Random出于性能原因,您应该使用全局实例,而不是每次都初始化一个 - 请参阅API.

请注意:

  • 对于多线程应用程序,您应该以每次调用的形式使用ThreadLocalRandomThreadLocalRandom.current().next...(请参阅有关此事项的官方建议).
  • 对于加密安全的随机数,请使用SecureRandom.