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()
被内在地调用。当调用ThreadLocalRandom
的nextInt()
方法时,线程运行并生成随机整数值。
它们可能会用相同的种子值生成相同的数字,但生成仍然是孤立的,即不存在对空间的竞争,就像在共享对象的情况下。
例子:
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
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。