📜  Java的ThreadLocalRandom 与 SecureRandom 类

📅  最后修改于: 2021-09-10 03:09:01             🧑  作者: Mango

Java.util 包的ThreadLocalRandom类是一个随机数生成器,它生成与当前线程隔离的随机数。它是 Random 类的子类。它使用内部生成的无法修改的种子值进行初始化。

ThreadLocalRandom 在多个线程同时运行的应用程序中很有用,因为随机数生成保持隔离,线程不必竞争共享实例(如 Random 类实例的情况),并提供更好的性能和更低的开销。但是,它在加密方面并不安全。这就是 SecureRandom 发挥作用的地方,本文稍后将对此进行讨论。

句法:

public class ThreadLocalRandom extends Random

ThreadLocalRandom 的用法一般是这样的:

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

执行:

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

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

例子:

Java
// java Program to illustrate ThreadLocalRandom class
  
// Importing class from java.util.concurrent package
import java.util.concurrent.ThreadLocalRandom;
  
// Main class
public class ThreadLocalRandomNumbers extends Thread {
  
    // The run() method of the Thread class
    // Must be defined by every class that extends it
    public void run()
    {
  
        // Try method to check for exceptions
        try {
            // Call the ThreadLocalRandom
            int r = ThreadLocalRandom.current().nextInt(20);
  
            // Print the generated number r
            System.out.println(
                "Thread " + Thread.currentThread().getId()
                + " generated " + r);
        }
  
        // Catch block to handle the exceptions
        catch (Exception e) {
            System.out.println("Exception");
        }
    }
    public static void main(String[] args)
    {
        // Create 2 threads
        ThreadLocalRandomNumbers t1
            = new ThreadLocalRandomNumbers();
        ThreadLocalRandomNumbers t2
            = new ThreadLocalRandomNumbers();
  
        // Start the threads using the start() method
        t1.start();
        t2.start();
    }
}


Java
// Java Program to illustrate SecureRandom Class
  
// Importing class from java.security package
import java.security.SecureRandom;
  
// Main class
public class SecureRandomNumbers {
  
    // Main driver method
    public static void main(String[] args)
    {
  
        // Try block to check for exceptions
        try {
  
            // Create an instance of SecureRandom
            // using the default constructor
            SecureRandom r = new SecureRandom();
  
            // Initialise a seed value
            int seed = 100;
  
            System.out.println("Random Numbers");
  
            for (int i = 0; i < 5; i++) {
                // Use the nextInt() method to generate
                // random numbers between 0 and seed-1
                // inclusive
                System.out.print(r.nextInt(seed) + " ");
            }
        }
  
        // Catch block to handle the exceptions
        catch (Exception e) {
  
            System.out.print("Exception");
        }
    }
}


输出
Thread 11 generated 2
Thread 12 generated 10

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

句法:

public class SecureRandom extends Random

让我们举个例子,在下面给出的代码中,我们创建 SecureRandom 类的一个实例并初始化种子值。接下来我们使用 for 循环调用 nextInt() 方法 5 次。 nextInt()方法使用种子值生成从 0 到 seed-1(含)的整数。所有这些都是在 try-catch 块中完成的,因为它在任何在线编译器上使用时都会引发异常(阅读下面给出的注释)。

例子

Java

// Java Program to illustrate SecureRandom Class
  
// Importing class from java.security package
import java.security.SecureRandom;
  
// Main class
public class SecureRandomNumbers {
  
    // Main driver method
    public static void main(String[] args)
    {
  
        // Try block to check for exceptions
        try {
  
            // Create an instance of SecureRandom
            // using the default constructor
            SecureRandom r = new SecureRandom();
  
            // Initialise a seed value
            int seed = 100;
  
            System.out.println("Random Numbers");
  
            for (int i = 0; i < 5; i++) {
                // Use the nextInt() method to generate
                // random numbers between 0 and seed-1
                // inclusive
                System.out.print(r.nextInt(seed) + " ");
            }
        }
  
        // Catch block to handle the exceptions
        catch (Exception e) {
  
            System.out.print("Exception");
        }
    }
}
输出
Random Numbers
Exception

输出

注意: SecureRandom 类由于其加密安全性质而不适用于在线编译器。但是,如果您在系统上使用 IDE,您将能够获得上图所示的输出。