java的随机类。Util包用于生成伪随机数流。它使用48位种子,通过实现线性同余公式进行修正。线性同余公式的一般形式是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
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。