java securerandom声明应该是静态类特定的,也可以是示例特定的

xtfmy6hx  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(334)

我正在尝试使用 SecureRandom 在我的java项目中生成随机数。但是我有点困惑,我该如何保存我的物品 SecureRandom . 它应该是一个 static 班级成员。我不打算从外面说这件事。以下是我目前的执行情况:

Class MyClass {

    private static final SecureRandom secureRandom = new SecureRandom();

    private long calculate(int noOfRetry){
        final long value = someValueCalculationWith-noOfRetry;
        final float randomNo = secureRandom().nextFloat() + 1;
        return (long) (value*randomNo);
    }
}

这是在java中使用securerandom的正确方法吗?

xkrw2x1b

xkrw2x1b1#

不,不行 static . 如果需要,可以将其设置为示例字段,但将其设置为类字段并不是最佳选择。e、 g.参见图纸上关于螺纹安全的注解 Random 从中派生的类:
示例 java.util.Random 是线程安全的。但是,同时使用相同的 java.util.Random 跨线程的示例可能会遇到争用,从而导致性能低下。考虑使用 ThreadLocalRandom 在多线程设计中。
小心,尽管 ThreadLocalRandom 在加密方面不安全,因此对您来说不是一个好的选择。一般来说,您应该尽量避免使用 static 类字段,尤其是当示例是有状态的时。
如果您只需要在一个或几个不在紧循环中的方法中使用随机示例,那么将其作为本地示例是非常好的(只需使用 var rng = new SecureRandom() 换句话说,甚至只是 new SecureRandom() 如果只有一个方法调用需要它)。

相关问题