📜  Java的Random 与 ThreadLocalRandom 类(1)

📅  最后修改于: 2023-12-03 15:02:05.610000             🧑  作者: Mango

Java的Random与ThreadLocalRandom类

在Java编程中,我们经常需要生成随机数。Java提供了两个类可以用来生成随机数,分别是java.util.Random类和java.util.concurrent.ThreadLocalRandom类。

1. Random类
1.1 介绍

java.util.Random类是Java中用来生成伪随机数的类。该类的用法非常简单,只需要创建该类的实例即可调用其nextInt()nextDouble()等方法来生成随机数。

1.2 使用示例
import java.util.Random;

public class RandomDemo {
    public static void main(String[] args) {
        Random random = new Random();
        
        // 生成一个随机的int类型整数
        int randomNum = random.nextInt();
        System.out.println("随机数为:" + randomNum);
        
        // 生成一个0-10之间的随机整数
        int randomNum10 = random.nextInt(11);
        System.out.println("0-10之间的随机数为:" + randomNum10);
        
        // 生成一个0-1之间的随机小数
        double randomDouble = random.nextDouble();
        System.out.println("0-1之间的随机小数为:" + randomDouble);
    }
}

输出结果:

随机数为:2078353365
0-10之间的随机数为:3
0-1之间的随机小数为:0.6976341274913611
2. ThreadLocalRandom类
2.1 介绍

java.util.concurrent.ThreadLocalRandom类是Java 7中新增的一个类,它是Random类的改进版,具有更好的性能和更高的并发性。相比于Random类,ThreadLocalRandom类中的方法没有synchronized关键字,因此可以更快地生成随机数。

2.2 使用示例
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomDemo {
    public static void main(String[] args) {
        // 生成一个随机的int类型整数
        int randomNum = ThreadLocalRandom.current().nextInt();
        System.out.println("随机数为:" + randomNum);
        
        // 生成一个0-10之间的随机整数
        int randomNum10 = ThreadLocalRandom.current().nextInt(11);
        System.out.println("0-10之间的随机数为:" + randomNum10);
        
        // 生成一个0-1之间的随机小数
        double randomDouble = ThreadLocalRandom.current().nextDouble();
        System.out.println("0-1之间的随机小数为:" + randomDouble);
    }
}

输出结果:

随机数为:-1910071015
0-10之间的随机数为:8
0-1之间的随机小数为:0.3830904825164474
3. 性能比较

为了比较Random类和ThreadLocalRandom类的性能,我们可以编写如下的测试代码:

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class RandomPerformanceTest {
    public static void main(String[] args) {
        int n = 10000000;
        int[] randomNums1 = new int[n];
        int[] randomNums2 = new int[n];
        
        Random random = new Random();
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            randomNums1[i] = random.nextInt();
        }
        long end1 = System.currentTimeMillis();
        System.out.println("Random耗时:" + (end1 - start1) + "毫秒");
        
        ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
        long start2 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            randomNums2[i] = threadLocalRandom.nextInt();
        }
        long end2 = System.currentTimeMillis();
        System.out.println("ThreadLocalRandom耗时:" + (end2 - start2) + "毫秒");
    }
}

在我的机器上运行,输出结果如下:

Random耗时:819毫秒
ThreadLocalRandom耗时:316毫秒

可以看出,ThreadLocalRandom类比Random类性能更好。

4. 总结

JavaRandom类和ThreadLocalRandom类都可以用来生成随机数,但是ThreadLocalRandom类具有更好的性能和更高的并发性。因此在多线程环境下,我们应该优先使用ThreadLocalRandom类来生成随机数。