java.util包中的ThreadLocalRandom类是一个随机数生成器,可以生成孤立于当前线程的随机数。它是Random类的一个子类。它用一个内部生成的种子值进行初始化,这个种子值不能被修改。该类的视图如下:

--> java.util Package
    --> ThreadLocalRandom Class

ThreadLocalRandom在多个线程并发运行的应用中非常有用,因为随机数的生成仍然是孤立的,线程不必争夺共享实例(就像在Random类实例的情况下),并提供更好的性能和更低的开销。然而,它在密码学上是不安全的。这就是SecureRandom发挥作用的地方,它将在本帖后面讨论。

语法:

public class ThreadLocalRandom extends Random

ThreadLocalRandom的用法一般是这样的:

ThreadLocalRandom.current().nextX(...) {where X = Int, Long, Double etc}

实现:

假设有两个线程在main()方法中被创建。现在在run()方法中调用ThreadLocalRandom.current.nextInt()。线程类的run()方法是编写任何线程的可执行部分的地方。当使用start()方法启动线程时,run()被内在地调用。当调用ThreadLocalRandomnextInt()方法时,线程运行并生成随机整数值。

它们可能会用相同的种子值生成相同的数字,但生成仍然是孤立的,即不存在对空间的竞争,就像在共享对象的情况下。

例子:

import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomNumbers extends Thread {
    public void run()
    {
        try {
            int r = ThreadLocalRandom.current().nextInt(20);
            System.out.println("Thread " + Thread.currentThread().getId()+ " generated " + r);
        }

        catch (Exception e) {
            System.out.println("Exception");
        }
    }

    public static void main(String[] args)
    {
        ThreadLocalRandomNumbers t1 = new ThreadLocalRandomNumbers();
        ThreadLocalRandomNumbers t2 = new ThreadLocalRandomNumbers();
        t1.start();
        t2.start();
    }
}

运行结果:

Thread 11 generated 3
Thread 14 generated 8

java.util包中的SecureRandom类是一个加密的安全随机数生成器。它是Random类的一个子类。一个加密安全的随机数符合FIPS 140-2《加密模块的安全要求》第4.9.1节中规定的统计随机数发生器测试。SecureRandom产生一个非确定性的输出,这是对这类模块的一个必要要求。

语法:

public class SecureRandom extends Random

下面举个例子,在下面的代码中,创建了一个SecureRandom类的实例并初始化了种子值。接下来使用for循环来调用nextInt()方法5次。nextInt()方法使用种子值来生成从0到种子-1(包括)的整数。所有这些都是在try-catch块内完成的,因为在任何在线编译器上使用时都会抛出一个异常(请阅读下面的说明)。

例子

import java.security.SecureRandom;

public class SecureRandomNumbers {

    public static void main(String[] args)
    {
        try {
            SecureRandom r = new SecureRandom();
            int seed = 100;
            System.out.println("Random Numbers are=>");
            for (int i = 0; i < 5; i++) {
                System.out.print(r.nextInt(seed) + " ");
            }
        }catch (Exception e) {
            System.out.print("Exception");
        }
    }
}

运行结果:

Random Numbers are=>15 39 78 90 3

注意:由于SecureRandom 类的加密安全性质,它在在线编译器上将无法工作。

下面以表格的形式来看看这些差异,如下图所示:

ThreadLocalRandom SecureRandom
ThreadLocalRandom是ThreadLocal和Random类的组合 SecureRandom类提供了一个密码学上强大的随机数发生器。
它被隔离在当前线程中。 它的语法是: public class SecureRandom extends Random
它在多线程环境中具有更好的性能 SecureRandom的实现是以伪随机数发生器的形式存在的。
ThreadLocalRandom不支持明确地设置种子。 这个类在在线编译器中不起作用。
它从jdk 1.7开始引入 SecureRandom类是Random类的子类。

SecureRandom类和ThreadLocalRandom类的区别

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:SecureRandom类和ThreadLocalRandom类的区别
本文链接:https://www.vsdiffer.com/vs/threadlocalrandom-vs-securerandom-class-in-java.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。