java的随机类。Util包用于生成伪随机数流。它使用48位种子,通过实现线性同余公式进行修正vsDIffeR。线性同余公式的一般形式是an+1 = k * an+ c
(对m取模),其中a0为种子,a1, a2,…,an+1为随机数,k, c, m为常数。
如果用相同的种子值创建Random类的两个实例,并为每个实例调用相同的方法序列,它们都将返回相同的数字序列。此属性由为该类定义的特定算法强制执行。该算法使用一种受保护的实用程序方法,在调用时可以给出多达32个伪随机生成的比特。Random的实例是线程安全的。但是,如果跨线程使用相同的实例,它们可能会受到争用的影响,从而导致性能下降。Random的实例不是加密安全的,因此不应该用于对安全性敏感的应用程序。
语法:
public class Random extends Object implements Serializable
让我们举一个例子,在下面给出的程序中,我们有三个Random类的实例。前两个具有传递给其构造函数的相同种子值。这导致当使用Random
类的nextInt()
方法时生成相同的数字。但是当改变种子的值并使用它来创建第三个实例时,生成的数字是不同的。这个示例清楚地说明了上述事实,即如果使用相同的种子值并且对两者使用相同的方法,则实例将生成相同的数字序列。
// Java Program to illustrate Random class
import java.util.Random;
public class RandomNumbers extends Random {
public static void main(String[] args)
{
long seed = 18;
Random r1 = new Random(seed);
System.out.println(r1.nextInt());
Random r2 = new Random(seed);
System.out.println(r2.nextInt());
seed = 34;
Random r3 = new Random(seed);
System.out.println(r3.nextInt());
}
}
运行结果:
-1248556696
-1248556696
-1161066041
现在来看下一个类,即ThreadLocalRandom类
ThreadLocalRandom
类存在于java内部。Util包还用于生成伪随机数流。它是上面讨论的Random类的一个子类。顾名思义,该类生成与当前线程隔离的随机数。ThreadLocalRandom使用内部生成的种子值初始化,该种子值不能以其他方式修改。使用ThreadLocalRandom而不是Random的共享实例将导致低争用和开销。ThreadLocalRandom,就像它的父类一样,不是加密安全的。
语法:
public class ThreadLocalRandom extends Random
实现:让我们举一个在主线程中创建两个简单线程的场景。在run()方法中调用ThreadLocalRandom.current.nextInt()
。两个线程使用相同的seed值,即10,但给出不同的结果,因为对nextInt()
的调用被线程执行隔离。
例子
import java.util.concurrent.ThreadLocalRandom;
class ThreadLocalRandomNumbers extends Thread {
public void run()
{
try {
int seed = 10;
int r = ThreadLocalRandom.current().nextInt(seed);
System.out.println("Thread " + Thread.currentThread().getId()+ " generated " + r);
}catch (Exception e) {
System.out.println("Exception");
}
}
public static void main(String[] args)
{
// Create two threads
ThreadLocalRandomNumbers t1 = new ThreadLocalRandomNumbers();
ThreadLocalRandomNumbers t2 = new ThreadLocalRandomNumbers();
t1.start();
t2.start();
}
}
运行结果:
Thread 12 generated 7
Thread 11 generated 0
上面已经完成了对这两个类的讨论,并对它们都有了充分的了解。现在通过总结它们之间的差异来结束文章。
Random | ThreadLocalRandom |
---|---|
如果不同的线程使用相同的随机实例,则会导致争用和随之而来的性能下降。 | 没有争用,因为生成的随机数是当前线程的本地数。 |
使用线性同余公式修改其种子值。 | 随机生成器使用内部生成的种子进行初始化。 |
在每个线程都有自己的一组要使用的随机实例的应用程序中很有用 | 。在多个线程在线程池中并行使用随机数的应用程序中很有用 | 。
它是父类。 | 它是子类。 |
Java中Random类和ThreadLocalRandom类的区别
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Java中Random类和ThreadLocalRandom类的区别
本文链接:https://www.vsdiffer.com/vs/random-vs-threadlocalrandom-classes-in-java.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏vSDiFfer。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱:,我们核实并会尽快处理。